我正在努力学习我以前认为我理解的主题 - JavaScript中的原型继承。
我有一个jsfiddle概述了我的问题here
我有一个基础对象和一个继承实现。我希望实现对基础属性进行更改,并使基础访问这些更新的属性。
任何人都可以指出我哪里出错了吗?
答案 0 :(得分:2)
调用this
时new cheeseBase()
的值是您从“cheddar()”内部用作原型的对象,而不是的实例“切达”。因此,“saySomething()”函数总是说“all cheese”,因为它引用了构造函数调用中的“捕获”this
。
如果您在“alert()”调用中更改“saySomething()”以引用“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规范的这个绑定下找到。