改进javascript原型继承

1 javascript inheritance prototype

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

function Foo() {}   
Naknek.prototype = {
//Do something
};
var Foo = window.Foo = new Foo();
Run Code Online (Sandbox Code Playgroud)

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

var Foo = window.Foo = new function() {
};
Foo.prototype = {
//Do something
};
Run Code Online (Sandbox Code Playgroud)

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

T.J*_*der 9

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

标准的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;
Run Code Online (Sandbox Code Playgroud)

以下是您的使用方法Foo:

// Create a `Foo` and use its `bar`
var f = new Foo();
f.bar();
Run Code Online (Sandbox Code Playgroud)

其他几点说明:

  • 永远不要使用,new function() { ... }除非你真的,真的知道你在做什么.它创建一个由函数初始化的对象,它不会创建新函数.除了一些先进的边缘情况之外,几乎从来没有任何类似(但完全不同)的需要new Function(...).
  • bar在我上面的示例中绑定的函数是匿名的(它绑定的属性有一个名称,但函数没有).我不是匿名函数的粉丝,但我不想弄乱上面的例子.更多这里.
  • 如果你var在全局范围内使用(从你的问题中不清楚你是否),它会在window对象上创建一个属性.var Foo = window.Foo = ...如果你在一个函数中并希望同时  创建一个名称window 创建一个名为的局部变量,那么你只需要这样做Foo.(也许你打算这样做!:-))
  • Foo.prototype = { .. };分配原型属性的方式是有效的,但它通常不是一个好主意(再次,除非你对这些东西非常快速).当你这样做时,你完全取代了通过函数调用函数时使用的原型对象new,而如果你只是为它添加属性(Foo.prototype.bar = ...),那么你只需要扩充原型,而不是替换原型.更换原型是完全有效的,但如果你不小心,可能会发生一些非显而易见的事情.:-)