javascript代码片段(代码片段)

author author     2022-12-05     125

关键词:

// apply 的模拟实现
Function.prototype.apply = function(context, arr) 
	var context = Object(context) || window;
	context.fn = this;

	var result;
	if (!arr) 
		result = context.fn();
	 else 
		var args = [];
		for (var i = 0, len = arr.length; i < len; i++) 
			args.push("arr[" + i + "]");
		
		result = eval("context.fn(" + args + ")");
	

	delete context.fn;
	return result;
;

// call 的模拟实现

Function.prototype.call2 = function(context) 
	var context = context || window;
	context.fn = this;

	var args = [];
	for (var i = 1, len = arguments.length; i < len; i++) 
		args.push("arguments[" + i + "]");
	

	var result = eval("context.fn(" + args + ")");

	delete context.fn;
	return result;
;

// 测试一下
var value = 2;

var obj = 
	value: 1
;

function bar(name, age) 
	console.log(this.value);
	return 
		value: this.value,
		name: name,
		age: age
	;


bar.call(null); // 2

console.log(bar.call2(obj, "kevin", 18));
// 1
// Object 
//    value: 1,
//    name: 'kevin',
//    age: 18
// 

// bind 的模拟实现
Function.prototype.bind2 = function(context) 
	if (typeof this !== "function") 
		throw new Error(
			"Function.prototype.bind - what is trying to be bound is not callable"
		);
	

	var self = this;
	var args = Array.prototype.slice.call(arguments, 1);

	var fNOP = function() ;

	var fBound = function() 
		var bindArgs = Array.prototype.slice.call(arguments);
		return self.apply(
			this instanceof fNOP ? this : context,
			args.concat(bindArgs)
		);
	;

	fNOP.prototype = this.prototype;
	fBound.prototype = new fNOP();
	return fBound;
;

// new 的模拟实现
function objectFactory() 
	var obj = new Object(),
		Constructor = [].shift.call(arguments);

	obj.__proto__ = Constructor.prototype;

	var ret = Constructor.apply(obj, arguments);

	return typeof ret === "object" ? ret : obj;

// 利用发布订阅模式,实现一个简单的数据绑定
function DataBinder(object_id) 
  // Create a simple PubSub object
  var pubSub = 
    callbacks: ,
    on: function(msg, callback) 
      this.callbacks[msg] = this.callbacks[msg] || [];
      this.callbacks[msg].push(callback);
    ,
    publish: function(msg) 
      this.callbacks[msg] = this.callbacks[msg] || [];
      for (var i = 0, len = this.callbacks[msg].length; i <= len; i++) 
        this.callbacks[msg][i].apply(this, arguments);
      
    
  ,
  data_attr = "data-bind-" + object_id,
  message = object_id + ":change",
  changeHandler = function(evt) 
    var target = evt.target || evt.srcElement, // IE8 compatibility
      prop_name = target.getAttribute(data_attr);

    if (prop_name && prop_name !== "") 
      pubSub.publish(message, prop_name, target.value);
    
  ;

  // Listen to change events and proxy to PubSub
  if (document.addEventListener) 
    document.addEventListener("change", changeHandler, false);
   else 
    // IE8 uses attachEvent instead of addEventListener
    document.attachEvent("onchange", changeHandler);
  

  // PubSub propagates changes to all bound elements
  pubSub.on(message, function(evt, prop_name, new_val) 
    var elements = document.querySelectorAll("[" + data_attr + "=" + prop_name + "]"),
      tag_name;

    for (var i = 0, len = elements.length; i <= len; i++) 
      tag_name = elements[i].tagName.toLowerCase();

      if (tag_name === "input" || tag_name === "textarea" || tag_name === "select") 
        elements[i].value = new_val;
       else 
        elements[i].innerHTML = new_val;
      
    
  );

  return pubSub;

function Node(element) 
  this.element = element;
  this.next = null;


function LinkedList() 
  this._head = new Node("This is Head Node.");
  this._size = 0;


LinkedList.prototype.display = function() 
  var currNode = this.getHead().next;
  while (currNode) 
    console.log(currNode.element);
    currNode = currNode.next;
  
;

LinkedList.prototype.remove = function(item) 
  if (item) 
    var preNode = this.findPre(item);
    if (preNode == null) return;
    if (preNode.next !== null) 
      preNode.next = preNode.next.next;
      this._size--;
    
  
;

LinkedList.prototype.add = function(item) 
  this.insert(item);
;

LinkedList.prototype.insert = function(newElement, item) 
  var newNode = new Node(newElement);
  var finder = item ? this.find(item) : null;
  if (!finder) 
    var last = this.findLast();
    last.next = newNode;
   else 
    newNode.next = finder.next;
    finder.next = newNode;
  
  this._size++;
;

/*********************** Utility Functions ********************************/

LinkedList.prototype.findLast = function() 
  var currNode = this.getHead();
  while (currNode.next) 
    currNode = currNode.next;
  
  return currNode;
;

LinkedList.prototype.findPre = function(item) 
  var currNode = this.getHead();
  while (currNode.next !== null && currNode.next.element !== item) 
    currNode = currNode.next;
  
  return currNode;
;

LinkedList.prototype.find = function(item) 
  if (item == null) return null;
  var currNode = this.getHead();
  while (currNode && currNode.element !== item) 
    currNode = currNode.next;
  
  return currNode;
;



var attributions = 
function get(that, key) 
    return attributions[that] && attributions[that][key]

function set(that, key, value) 
    if(!attributions[that]) attributions[that] = 
    attributions[that][key] = value


class MyClass 
    set() 
        set.apply(this, 'name', "cpf")
    
    get() 
        let name = get.apply(this, 'name')
        console.log(name)
    


var events = 
var data = 
class MyClass 
    on(event, handler) 
        if(!events[event]) events[event] = []
        events[event].push(handler)
    
    trigger(event, params = []) 
        let evts = events[event]
        if(Array.isArray(evts)) evts.forEach(callback => 
            if(typeof callback === 'function') 
                if(Array.isArray(params)) callback.apply(this, params)
                else callback.call(this, params)
            
        )
    
    get(key) 
        return data[this] && data[this][key]
    
    set(key, value, notify = true) 
        if(!data[this]) data[this] = 
        data[this][key] = value
        if(notify) 
            this.trigger('change:' + key, value)
        
    
    call(factory, ...args) 
        factory.apply(this, args)
    



debounce = (fn, delay) => 
  let timer;
  return () => 
    clearTimeout(timer)
    timer = setTimeout(() => 
      fn.apply(this, arguments)
    , delay);
  


throttle = (fn, threshhold = 250) => 
  let last 
  let timer 
  return ()=> 
    let now = +new Date()
    if (last && now < last + threshhold) 
      clearTimeout(timer)
      timer = setTimeout(() => 
        last = now
        fn.apply(this, arguments)
      , threshhold);
     else 
      last = now
      fn.apply(context, args)
    
  

javascript片段(代码片段)

查看详情

javascript媒体片段(代码片段)

查看详情

javascript异步片段(代码片段)

查看详情

javascript测试片段(代码片段)

查看详情

javascript测试片段(代码片段)

查看详情

javascript媒体片段(代码片段)

查看详情

javascript测试片段(代码片段)

查看详情

javascript绘制代码(代码片段)

查看详情

javascript前端代码(代码片段)

查看详情

javascript绘制代码(代码片段)

查看详情

javascript肯特片段(代码片段)

查看详情

javascript(原始)数组片段(代码片段)

查看详情

javascript用于在节点#nodejs#javascript内设置reactapp的代码片段(代码片段)

查看详情

javascript工作常用代码(代码片段)

查看详情

javascript承诺演示代码(代码片段)

查看详情

javascript基准像素代码(代码片段)

查看详情

javascript代码序列史诗(代码片段)

查看详情

javascript有趣的代码(代码片段)

查看详情