【问题标题】:improve javascript prototypal inheritance改进 javascript 原型继承
【发布时间】:2011-03-02 18:16:26
【问题描述】:

我正在使用经典的 javascript 原型继承,如下所示:

function Foo() {}   
Naknek.prototype = {
//Do something
};
var Foo = window.Foo = new Foo();

我想知道如何改进这一点以及为什么我不能使用这个模型:

var Foo = window.Foo = new function() {
};
Foo.prototype = {
//Do something
};

为什么这段代码不起作用?在我看来,这比经典的原型继承更合乎逻辑。

【问题讨论】:

    标签: javascript inheritance prototype


    【解决方案1】:

    您的var Foo = window.Foo = new Foo(); 示例是...奇怪。首先你声明一个函数Foo,然后你给它的原型赋值(我假设你打算在你的第二行用Foo替换Nannak),然后你通过赋值来覆盖对函数的引用。

    标准 Javascript 原型继承如下所示:

    // Create a constructor `Foo`
    function Foo() {
    }
    
    // Give the prototype for `Foo` objects a function bound to the
    // property `bar`
    Foo.prototype.bar = function() {
    }
    
    // Only do this bit if you're doing this within a function and you want
    // to make `Foo` available as a property of `window` (e.g., effectively
    // a global variable. If this code is already at global scope, there's
    // no need to do this.
    window.Foo = Foo;
    

    下面是你如何使用Foo

    // Create a `Foo` and use its `bar`
    var f = new Foo();
    f.bar();
    

    其他几点说明:

    • 永远不要使用new function() { ... },除非你真的、真的知道你在做什么。它创建一个由函数初始化的对象,它不创建一个新函数。几乎不需要类似(但完全不同)new Function(...),同样,除了一些高级边缘情况。
    • 在我上面的示例中绑定到bar 的函数是匿名的(它绑定到的属性有名称,但函数没有)。我不喜欢匿名函数,但我不想弄乱上面的例子。 More here.
    • 如果您在全局范围内使用 var(您的问题并不清楚您是否使用过),它会在 window 对象上创建一个属性。如果你在一个函数中并且想要both创建window的属性创建一个名为@987654337的局部变量,你只需要做var Foo = window.Foo = ... @。 (也许你打算这样做!:-))
    • Foo.prototype = { .. }; 分配原型属性的方式有效,但通常不是一个好主意(同样,除非您对这些东西非常了解)。当你这样做时,你完全替换通过new调用函数时使用的原型对象,而如果你只是向它添加属性(Foo.prototype.bar = ...),你只是在扩充原型,而不是替换它。替换原型是完全有效的,但如果你不小心,可能会发生一些不明显的事情。 :-)

    【讨论】:

    • 现在我想知道:那些“高级边缘案例”是什么?有没有legitimate uses of the Function constructor?
    • @Marcel:哈哈!答案是:当然有。但是你必须知道你在处理什么,而且 OP 显然是一个新手(就像我们曾经一样),所以......
    【解决方案2】:

    您在函数表达式上使用new 运算符,这会导致将新创建的对象分配给window.Foo

    那个新对象不是一个函数,因此它没有prototype 属性并且不能被调用。

    【讨论】:

      【解决方案3】:

      “不起作用”是模糊的,但我认为根本原因是new function() {new 不属于这里)

      你可能想要:

      var Foo = window.Foo = function() {
      };
      Foo.prototype = {
        bar: 'baz'
      };
      
      alert(new Foo().bar); // baz
      

      【讨论】:

        猜你喜欢
        • 2010-09-28
        • 2018-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-17
        • 1970-01-01
        相关资源
        最近更新 更多