【问题标题】:Crockford Prototypical Inheritance... no prototype chain? No super?Crockford 原型继承...没有原型链?没有超?
【发布时间】:2010-07-26 21:49:58
【问题描述】:

试图更多地了解 Crockford 的原型继承方法,他从本质上消除了构造函数,从而消除了原型链的任何实际可能性或利用“超级”的想法。

mynamespace.object.create = function( o ) {
    function F(){};
    F.prototype = o;
    return new F();
};

这是基于原型背后的理论故意的吗?

我遇到这个问题的原因是我想创建一个带有 init 方法的基类,该方法执行一些常见的 jquery 工作(这些方法旨在自动从 www.alexsexton.com/? p=51)

作为一个例子,我不想在我的每一个 init 方法中都重复这一点 this.options = $.extend({},this.options,options);

所以我想把它放在一个基础初始化中,在我的扩展对象中覆盖初始化,然后在覆盖中调用 this.prototype.init 来处理那些重复的东西。

object.create 似乎不允许我以任何方式这样做。我在这里遗漏了什么吗?

【问题讨论】:

    标签: javascript jquery-plugins


    【解决方案1】:

    该技术以原型链为中心,这种继承也称为差分继承

    例如:

    var obj = {};
    var obj1 = Object.create(obj);
    var obj2 = Object.create(obj1);
    

    obj2 的原型链如下所示:

    -------- -------- ------------------ obj2 ---> |对象1 | -----> |对象 | -----> | Object.prototype | -----> 空 -------- -------- ------------------

    上例中连接对象的箭头是内部[[Prototype]]属性,它构成了原型链。

    当你尝试访问一个属性时,例如obj2,它将沿着原型链上的所有对象搜索直到找到,否则属性访问器将简单地产生undefined

    super 的概念并不真正存在,尽管有办法知道对象的[[Prototype]]

    ECMAScript 5th Edition 引入了Object.getPrototypeOf 方法,例如:

    Object.getPrototypeOf(obj2) === obj1; // true
    

    但是这个方法是not widely supported yet(以及标准的Object.create)。

    一些实现通过__proto__ 属性提供对对象的[[Prototype]] 的访问,例如:

    obj2.__proto__ === obj1; // true
    

    但请记住,__proto__ 是非标准的。

    isPrototypeOf 方法是 ECMAScript 3 的一部分,可让您知道一个对象是否在另一个对象的原型链中,例如:

    obj1.isPrototypeOf(obj2);             // true
    obj.isPrototypeOf(obj2);              // true
    Object.prototype.isPrototypeOf(obj2); // true
    

    总之,只要在原型链中找到一个属性就会被解析,如果你想避免__proto__Object.getPrototypeOf(因为第一个是非标准的,前者尚未得到广泛支持),我只是建议您在基础对象中为您的 init 方法添加前缀,以便可以从更具体的实例中访问它,例如:

    var base = {
      baseInit: function () { /*...*/ }
    };
    
    var specific = Object.create(base);
    specific.init = function () {
      //...
      this.baseInit();
      //...
    };
    
    specific.init();
    

    【讨论】:

    • 所以如果我要理解 var base = { baseInit: function () { /*...*/ } }; var specific = Object.create(base); specific.init = function () { //... this.baseInit(); //... }; var specificInstance = Object.create(specific);然后应该能够访问:this.init() && this.baseInit()?让我试一试。
    • 但是那么只有两级对象继承吗?不能一直重命名。
    猜你喜欢
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 2015-07-07
    相关资源
    最近更新 更多