JavaScript原型继承混乱 - 我在这里缺少什么?

时间:2011-11-16 19:20:54

标签: javascript prototypal-inheritance

我正在努力学习我以前认为我理解的主题 - JavaScript中的原型继承。

我有一个jsfiddle概述了我的问题here

我有一个基础对象和一个继承实现。我希望实现对基础属性进行更改,并使基础访问这些更新的属性。

任何人都可以指出我哪里出错了吗?

3 个答案:

答案 0 :(得分:2)

调用thisnew cheeseBase()的值是您从“cheddar()”内部用作原型的对象,而不是的实例“切达”。因此,“saySomething()”函数总是说“all cheese”,因为它引用了构造函数调用中的“捕获”this

如果您在“alert()”调用中更改“say​​Something()”以引用“this.favoriteCheese”,则会在弹出窗口中显示“cheddar”。

如果你真的希望子类修改基础对象,或者你可以重新排列:

function cheesebase() {

    var that = this;

    this.favouriteCheese = "all cheese";

    this.setBaseCheese = function(chz) {
      that.favouriteCheese = chz;
    };

    this.saySomething = function() {
        alert("My favourite cheese is " + that.favouriteCheese);
    };
}

function cheddar() {

    var returnObject = Object.create(new cheesebase());

    returnObject.setBaseCheese("cheddar");

    returnObject.saySomethingElse = function() {
        alert("I like cheese");
    };

    return returnObject;
}

答案 1 :(得分:1)

也许你想要实现的目标是:http://jsfiddle.net/yrU6y/1/

无论如何,在您的原始示例中,您没有使用基础对象的原型。这意味着每次创建新的cheesebase时,您都会重新定义其函数,即每个cheesebase对象都有自己的函数,而不是共享原型(并使用更少的内存)。

答案 2 :(得分:1)

我最好的猜测,以下代码会导致问题。

var that = this; 

我的原始直觉(不参考JS规范),基于原型的继承基于原型对象的单个实例,而不复制此对象。 因此,this内的cheeseBase指针指向原型对象,永远不会改变。

后代方法和属性绑定,在寻找方法或属性时迭代[this,this.prototype,this.prototype.prototype,...]序列,其中每个原型a都是不可变的单例对象。

鉴于此,cheeseBase构造函数有this指向实际原型,将此指针存储在that内,并在that周围创建闭包,这是原型对象。

并且,在执行cheeseBase this更改到实际对象实例的绑定期间。

我想这样的东西,可以在JS规范的这个绑定下找到。