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
时间: 2024-10-16 00:10:57

js37---Function.prototype的相关文章

《javascript设计模式与开放实践》学习(一)Function.prototype.bind

使用Function.prototype.bind来包装func函数 1.简化版的bind Function.prototype.bind=function (context) { var self=this; //保存原函数 return function () { return self.apply(context,arguments); } }; var obj={name:'seven'}; var func=function(){ alert(this.name); }.bind(ob

Function.prototype.bind

解析Function.prototype.bind 简介 对于一个给定的函数,创造一个绑定对象的新函数,这个函数和之前的函数功能一样,this值是它的第一个参数,其它参数,作为新的函数的给定参数. bind的作用 bind最直接的作用就是改变this的指向 // 定义函数 var checkNumericRange = function (value) { if (typeof value !== 'number') return false; else return value >= this

Function.prototype.bind接口浅析

本文大部分内容翻译自 MDN内容, 翻译内容经过自己的理解. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind Function.prototype.bind Syntax fun.bind(thisArg[, arg1[, arg2[, ...]]]) Parameters thisArg The value to be passed as the thi

Object.prototype和Function.prototype一些常用方法

Object.prototype 方法: hasOwnProperty 概念:用来判断一个对象中的某一个属性是否是自己提供的(主要是判断属性是原型继承还是自己提供的) 语法:对象.hasOwnProperty('属性名') var o = { name: 'jim' }; function Person() { this.age = 19; this.address='北京'; this.work='上海'; } Person.prototype = o; var p = new Person(

Object.prototype 与 Function.prototype 与 instanceof 运算符

方法: hasOwnProperty isPrototypeOf propertyIsEnumerable hasOwnProperty 该方法用来判断一个对象中的某一个属性是否是自己提供的( 住要用在判断属性是原型继承的还是自己提供的 ) 语法: 对象.hasOwnProperty( '属性名' ) -> boolean isPrototypeOf 凡是看到 of 翻译成 的, 反过来翻译: prototype of obj, 翻译成 obj 的 原型 因此该方法的含义是: xxx 是 xxx

Function.prototype.apply.call

我们先从一道简单的题目开始,前几天在git上看到的: 定义log方法,它可以代理console.log的方法.log(1,2,3)  =>  1 2 3 通常,你的答案会是这样的: function log(){ var args = Array.prototype.slice.call(arguments); console.log.apply(console, args); }; 直到有一天,你看到一个非常高大上的答案: function log(){ Function.prototype.

理解 JavaScript 中的 Function.prototype.bind

函数绑定(Function binding)很有可能是你在开始使用JavaScript时最少关注的一点,但是当你意识到你需要一个解决方案来解决如何在另一个函数中保持this上下文的时候,你真正需要的其实就是 Function.prototype.bind(),只是你有可能仍然没有意识到这点. 第一次遇到这个问题的时候,你可能倾向于将this设置到一个变量上,这样你可以在改变了上下文之后继续引用到它.很多人选择使用 self, _this 或者 context 作为变量名称(也有人使用 that)

一个简易版的Function.prototype.bind实现

重新看<JavaScript设计模式与开发实践>一书,第32页发现个简易版的Function.prototype.bind实现,非常容易理解,记录在这了. Function.prototype.bind = function (context) { var self = this; return function () { return self.apply(context, arguments); }; }; var obj = { name: 'sven' }; var func = fu

浅析function.prototype.bind

作用: 对于一个给定的函数,创造一个绑定对象的新函数,这个函数和之前的函数功能一样,this值是它的第一个参数,其它参数,作为新的函数的给定参数. bind最直接的作用就是改变this的指向: // 定义函数 var checkNumericRange = function (value) { if (typeof value !== 'number') return false; else return value >= this.minimum && value <= th

ES6 spread operator 实现Function.prototype.apply

之前出于好奇想自己实现apply的功能(不使用call,bind),一写才发现用eval无法实现,除非传入的参数全是字符串. 今天突然看到这个ES6新特性spread opertor,发现有戏了 Function.prototype.apply2 = function(obj, arg) { var t = typeof obj == 'object' && !!obj ? obj : window, res; t.__func__ = this; if(arg) { if(!Array.