您能解释下面提到的两个代码之间的区别吗?
function Person(){}
Person.prototype.dance = function(){};
function Ninja(){}
Ninja.prototype = Person.prototype;
和
function Person(){}
Person.prototype.dance = function(){};
function Ninja(){}
Ninja.prototype = new Person();
我对这些方面感到困惑:
Ninja.prototype = Person.prototype;
和
Ninja.prototype = new Person();
我开始知道第二个支持继承而第一个支持继承,你能解释一下第二个支持魔法吗?
答案 0 :(得分:14)
设置Ninja.prototype = Person.prototype;
说所有Ninjas都是人,所有人都是Ninjas ,因为它只是让两个原型指向同一个东西。因此,更改Ninja.prototype
将更改Person.prototype
,反之亦然。
设置Ninja.prototype = new Person();
表示所有Ninjas都是常规人,但可以修改Ninja.prototype
而不更改Person
的定义。这里的关键是new
关键字,它创建Person
的唯一实例,因此可以自由修改而不会影响其他任何内容。
Ninja.prototype = Person.prototype
将Ninja
的原型定义为与Person的相同:
function Person() {}
Person.prototype.dance = function () {}; // A Person can dance
function Ninja()
Ninja.prototype = Person.prototype; // Now a Ninja can dance too!
Ninja
的实例具有Person
的能力:
var ninja = new Ninja();
ninja.dance();
但,对Ninja
定义的修改也会影响Person
的实例:
Ninja.prototype.kill = function () {}; // Oh no! Now a Person can kill too!
var bob = new Person();
bob.kill(); // Not what we wanted...
Ninja.prototype = new Person()
以与以前相同的方式定义Person
:
function Person(){};
Person.prototype.dance = function () {}; // A Person can dance
现在我将Ninja.prototype = new Person()
分成两步。首先,创建一个名为Person
的新defaultNinja
:
var defaultNinja = new Person(); // Despite the name, it's just a regular Person
然后将所有Ninja
定义为默认值:
function Ninja(){};
Ninja.prototype = defaultNinja; // Really the same as Ninja.prototype = new Person();
这一次,如果我们改变Ninja
可以做的事情:
Ninja.prototype.kill = function () {};
// OR,
defaultNinja.kill = function () {};
Person
的实例不受影响:
ninja.kill(); // Now the ninja can kill
var bob = new Person();
bob.kill(); // ERROR, because Person.prototype doesn't have kill(),
// only defaultNinja does