你能解释一下下面提到的两个代码之间的区别吗?
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();
解决方法
>设置Ninja.prototype = Person.prototype;是说所有忍者都是人,而所有人都是忍者,因为它只是使两个原型指向同一个东西.因此,更改Ninja.prototype将更改Person.prototype,反之亦然.
>设置Ninja.prototype = new Person();我说Ninjas都是一个普通人,但Ninja.prototype可以在不改变Person定义的情况下进行修改.这里的关键是new关键字,它创建了Person的唯一实例,因此可以自由修改而不会影响其他任何内容.
>设置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!
忍者的一个实例具有人的能力:
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()分为两步.首先,创建一个名为defaultNinja的新Person:
var defaultNinja = new Person(); // Despite the name,it's just a regular Person
然后将所有Ninjas定义为默认值:
function Ninja(){}; Ninja.prototype = defaultNinja; // Really the same as Ninja.prototype = new Person();
这一次,如果我们改变Ninjas可以做的事情:
Ninja.prototype.kill = function () {}; // OR,defaultNinja.kill = function () {};
人员实例不受影响:
ninja.kill(); // Now the ninja can kill var bob = new Person(); bob.kill(); // ERROR,because Person.prototype doesn't have kill(),// only defaultNinja does