在理解Crockford引入的功能继承模式的过程中,我带来了这种代码的和平:
var person = function(spec) {
var that= {};
that.name = spec.name;
that.job = spec.job || '';
that.greeting = function() {
console.log("Hello, I'm " + this.name + " and I'm a " + this.job);
};
return that;
};
var coder = function(spec) {
var that = person(spec);
that.job = "coder";
// that.superior_greeting= that.superior('greeting');
that.superior_greeting = that.greeting;
that.greeting = function(){
console.log("I write code");
};
return that;
};
让我们创建coder
实例aCoder = coder({name: "tarrsalah"});
,调用greeting
方法打印出我怀疑的I write code
。
我的问题是:为什么运行superior_greeting
会给我一个不同的结果(打印Hello, I'm tarrsalah and I'm a coder
)?
superior_greeting
是否指向that.greeting
,是不是要修改greeting
方法还应修改superior_greeting
?
答案 0 :(得分:1)
“
superior_greeting
是否指向that.greeting
,是否修改了问候方法还应修改superior_greeting
?”
没有。 superior_greeting
并未以您认为的方式指向greeting
。 JavaScript没有指针,但它的对象(包括函数)被保存为引用。
所以你现在这样做了:
that.superior_greeting = that.greeting;
... superior_greeting
拥有与greeting
相同功能的引用。它确实不指向greeting
属性本身的指针。
所以基本上你没有制作这个函数的副本,但你确实复制了对同一个函数的引用,它在内存中存在某处。
由于您没有指向.greeting
属性的指针,因此.superior_greeting
无法看到对该属性的更改。
所以当你这样做时:
that.greeting = function(){
console.log("I write code");
};
...您创建了一个新函数,并将该新函数的新引用分配给.greeting
属性。
现在.greeting
和.superior_greeting
正在引用两个不同的函数。
答案 1 :(得分:0)
是的,因为
that.superior_greeting = that.greeting;
之前
that.greeting = function(){
console.log("I write code");
};
在that.superior_greeting
覆盖之前, person
设置为旧的coder
版本。
就像
that.superior_greeting = function() {
console.log("Hello, I'm " + this.name + " and I'm a " + this.job);
};
that.greeting = function(){
console.log("I write code");
};
如果你颠倒了两条原始线条,那么最终会有不同的东西。