在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
的构造函数。
为什么不调用父构造函数?
答案 0 :(得分:3)
为什么不调用父构造函数?
因为我们希望只在创建实例时调用构造函数。但是,Ninja.prototype
不是Person
的实例,它不应具有name
或surname
属性 - 它应该只继承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
函数乱丢源代码