Javascript继承(通过Backbone源代码),为什么Backbone中的Surrogate功能?

时间:2014-10-06 17:53:16

标签: javascript backbone.js

在javascript中实现继承的常用方法如下:

function Person(name, surname) {
  this.name = name;
  this.surname = surname;
}

Person.prototype.whoAmI = function() {
  console.log("I'am " + this.name + " " + this.surname);
}

function Ninja() {
  Person.apply(this, arguments); // call to parent constructor
}

Ninja.prototype = new Person();
Ninja.prototype.constructor = Ninja;

var ninja = new Ninja("John", "Doe");
ninja.whoAmI();

从骨干我可以看到的是使用“代理”功能,如:(非常简化的例子,我可以从Backbone源代码中提取示例)

function Person(name, surname) {
  this.name = name;
  this.surname = surname;
}

Person.prototype.whoAmI = function() {
  console.log("I'am " + this.name + " " + this.surname);
}

function Ninja() {
  Person.apply(this, arguments);
}

var Surrogate = function() { this.constructor = Ninja; }
Surrogate.prototype = Person.prototype;
Ninja.prototype = new Surrogate();

var ninja = new Ninja("John", "Doe");
ninja.whoAmI();

根据我的理解,这些示例完全相同,所以为什么需要Surrogate函数。 我在消息来源中找到一条关于此的评论:

  

将原型链设置为从parent继承而不调用   parent的构造函数。

为什么不调用父构造函数?

1 个答案:

答案 0 :(得分:3)

  

为什么不调用父构造函数?

因为我们希望只在创建实例时调用构造函数。但是,Ninja.prototype不是Person的实例,它不应具有namesurname属性 - 它应该只继承whoAmI方法。有关详细信息,另请参阅What is the reason to use the 'new' keyword at Derived.prototype = new Base

  

在javascript中实现继承的常用方法类似于

只有“喜欢的东西”。正确的方法不是调用父构造函数,但我们不需要Surrogate这个东西。标准只是使用Object.create

Ninja.prototype = Object.create(Person.prototype);
Ninja.prototype.constructor = Ninja;

(为了与ES3环境兼容 shim Object.create,而不是使用Surrogate函数乱丢源代码