在函数继承模式中访问高级方法(一个计数器示例意外地工作!)

时间:2014-01-25 00:45:14

标签: javascript inheritance functional-programming

在理解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

ps: very related question

2 个答案:

答案 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");
};

如果你颠倒了两条原始线条,那么最终会有不同的东西。