1

鉴于这段代码:

var SuperClass = function(a, b) {
  this.a = a;
  this.b = b;
};

SuperClass.prototype.getA = function() {
  return this.a;
};

var SubClass = function(a, b, c) {
  SuperClass.call(this, a, b);
  this.c = c;
};

为了启动SubClass原型,大多数建议似乎如下:

SubClass.prototype = new SuperClass();

对我来说创建(实例化)一个新SuperClass对象(具有自己的属性ab属性)只是为了作为SubClass.

这也有效:

// anti-pattern
SubClass.prototype = SuperClass.prototype;

但它通过SuperClass.prototype引用传递对象,因此您添加到的任何内容SubClass.prototype也会添加到SuperClass.prototype,因为它们是同一个对象。在大多数情况下,这不是预期的行为。

SuperClass问题:有没有一种方法可以在不创建 的实例作为基本原型的情况下实现正确的原型SubClass设计?

4

2 回答 2

5

在现代浏览器下:

SubClass.prototype = Object.create( SuperClass.prototype );

这使您可以在不调用父类的“构造函数”方法的情况下创建一个已定义的对象。有关更多详细信息,请继续阅读(包括旧浏览器的 polyfill 实现)。__proto__ Object.create

在行动中看到:

function Foo(){ console.log("AHHH!"); }
Foo.prototype.foo = 42;
function Bar(){}
Bar.prototype = Object.create(Foo.prototype);  // Note: no "AHHH!" shown
Bar.prototype.bar = 17;

// Showing that multi-level inheritance works
var b = new Bar;
console.log(b.foo,b.bar); //-> 42, 17

// Showing that the child does not corrupt the parent
var f = new Foo;          //-> "AHHH!"
console.log(f.foo,f.bar); //-> 42, undefined

// Showing that the inheritance is "live"
Foo.prototype.jim = "jam";
console.log(b.jim);       //-> "jam"
于 2012-05-23T23:33:24.523 回答
0

旧浏览器的 Polyfill 实现

// Create a new instance based on existing object
function object(o) {
  function F() {};
  F.prototype = o;
  return new F();
}

function inherit(subClass, superClass) {
  var prototype = object(superClass.prototype);
  prototype.constructor = subClass;
  subClass.prototype = prototype;
}

虽然通过 superClass.prototype 导致F.prototype = superClass.prototype,当对象函数返回时,F 函数不再被访问。结果,您无法获取和更改 F.prototype。

例子:

function SuperClass() {};
function SubClass() {};

SuperClass.prototype.say = function() {console.log('super');};

var instance = object(SuperClass.prototype); //instance.__proto__ === SuperClass.prototype
instance.say();
于 2013-07-14T16:09:25.280 回答