js37---Function.prototype

简介:
复制代码
    //给函数的prototype新增名字为name,函数体为fn的函数
    
    Function.prototype.method =function(name,fn){
        this.prototype[name] = fn;//this
        return this;
    }
    
    //再扩展Array的方法,新方法的名字,函数体,形参,实参
    
    if(!Array.prototype.forEach){
        //Array.prototype.forEach = function(fn,thisObj){}
        
        //this.fns.forEach(  function(el){el(o);}  ) function(el){el(o)是函数实参
        
        Array.method("forEach",function(fn,thisObj){//forRach是函数名字,后面是函数声明,fn,thisObj是声明里的形参
            var scope = thisObj || window;
            for (var i = 0; i < this.length; i++) {
                fn.call(scope,this[i],i,this);
            }
        })
    }
    if(!Array.prototype.filter){
        //this.fns.filter(function(el){if(el != xxx){return el;}})
        Array.method("filter",function(fn,thisObj){
            var scope = thisObj || window;
            var a = [];
            for (var i = 0; i < array.length; i++) {
                if( !fn.call(scope,this[i],i,this) ){
                    continue;
                }
                a.push(this[i])
            }
            //..........................
            return a;
        })
    }
复制代码
复制代码
window.DED = window.DED||{};//有就用自己,没有就用空对象
    DED.util = DED.util || {}
    //观察者
    DED.util.Observer = function(){
        this.fns = []
    }
    //扩展他
    DED.util.Observer.prototype = {
        //观察
        subscribe : function(fn){
            this.fns.push(fn);
        },
        //取消观察
        unsubscribe : function(fn){
            this.fns = this.fns.filter(function(el){
                if(el != fn){
                    return el;
                }
            })
        },
        //循环执行函数被观察的数组
        fire:function(o){
            this.fns.forEach(function(el){
                el(o);
            })
        }
    }
复制代码
复制代码
addEvent(items, 'click', function(e) {
          var e = e || window.event;
          var src = e.target || e.srcElement;
          try {
            e.preventDefault();
          }
          catch (ex) {
            e.returnValue = false;
          }
复制代码
复制代码
function F(){}
    var f = function(){}
    
    Function.prototype.method =function(name,fn){
        alert(1);
    }
    f.method();//1
    F.method();//1
 

function F(){}
    var f = function(){}
    
    Function.prototype.method =function(name,fn){
        this.prototype[name] = fn;
        return this;
    }
    f.method("a",function(){alert("a");});//1
    F.method("b",function(){alert("b");});//1

    //f.a();//f.a is not a function
    f.prototype.a();//a
    //F.b();//F.b is not a function
    F.prototype.b()//b
    new F().b();//b
复制代码

 形参看成构造函数传入的成员变量的值。函数名看成类名。this.看成成员属性和成员方法。

 

复制代码
    function addCar(){
        this.name = 11;
        this.begin = function(){//对象的成员方法属性可以用中括号获取
            alert(1);
        }
    }
    new addCar().begin();//1
    alert(new addCar()["begin"]);//this.begin = function(){alert(1);}
    alert(typeof new addCar()["begin"]);//function
    new addCar()["begin"]();//1
    alert(new addCar()["name"]);//11
    
    var rr = new addCar();
    rr["age"] = 444;
    alert(rr["age"]);//444
    rr["fff"] = function(){alert(777);}
    rr["fff"]();//777
复制代码

 



本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/6892215.html,如需转载请自行联系原作者
相关文章
|
5天前
|
JavaScript 前端开发
js的let、const、var的区别以及应用案例
【4月更文挑战第27天】ES6 中,`let` 和 `const` 是新增的变量声明关键字,与 `var` 存在显著差异。`let` 允许重新赋值,而 `const` 不可,且两者都具有块级作用域。`var` 拥有函数级作用域,并可在函数内任意位置访问。`let` 和 `const` 声明时必须初始化,而 `var` 不需。根据需求选择使用:局部作用域用 `let`/`const`,全局或函数范围用 `var`,不可变值用 `const`。
24 2
|
5天前
|
JavaScript
JS中var、let、const的区别
JS中var、let、const的区别
|
10月前
|
存储 JavaScript
JS arguments对象
众所周知,js是一门相当灵活的语言。当我们在js中在调用一个函数的时候,我们经常会给这个函数传递一些参数,js把传入到这个函数的全部参数存储在一个叫做arguments的东西里面
|
JavaScript 开发者
Js中的var、let、const有什么区别?
Js中的var、let、const有什么区别?
219 0
|
JavaScript 前端开发 设计模式
|
JavaScript 前端开发