有关JavaScript中继承的问题

Roc*_*ngh 7 javascript oop jquery inheritance

你能解释下面提到的两个代码之间的区别吗?

function Person(){} 
Person.prototype.dance = function(){}; 

function Ninja(){} 

Ninja.prototype = Person.prototype; 
Run Code Online (Sandbox Code Playgroud)

function Person(){} 
Person.prototype.dance = function(){}; 

function Ninja(){} 


Ninja.prototype = new Person();
Run Code Online (Sandbox Code Playgroud)

我对这些方面感到困惑:

Ninja.prototype = Person.prototype; 
Run Code Online (Sandbox Code Playgroud)

Ninja.prototype = new Person();
Run Code Online (Sandbox Code Playgroud)

我开始知道第二个支持继承而第一个支持继承,你能解释一下第二个中的魔法是什么吗?

Dav*_*ang 14

  1. 设置Ninja.prototype = Person.prototype;是说所有Ninjas都是人,所有人都是Ninjas,因为它只是使两个原型指向同一个东西.所以变化Ninja.prototype会改变Person.prototype,反之亦然.

  2. 设置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!
Run Code Online (Sandbox Code Playgroud)

一个实例Ninja具有的能力Person:

var ninja = new Ninja();
ninja.dance();
Run Code Online (Sandbox Code Playgroud)

但是,对定义的修改Ninja也会影响以下实例Person:

Ninja.prototype.kill = function () {}; // Oh no! Now a Person can kill too!
var bob = new Person();
bob.kill(); // Not what we wanted...
Run Code Online (Sandbox Code Playgroud)

例子 Ninja.prototype = new Person()

Person以与以前相同的方式定义:

function Person(){};
Person.prototype.dance = function () {}; // A Person can dance
Run Code Online (Sandbox Code Playgroud)

现在我将Ninja.prototype = new Person()分成两步.首先,创建一个Person名为defaultNinja:

var defaultNinja = new Person(); // Despite the name, it's just a regular Person
Run Code Online (Sandbox Code Playgroud)

然后将所有Ninjas 定义为默认值:

function Ninja(){};
Ninja.prototype = defaultNinja; // Really the same as Ninja.prototype = new Person();
Run Code Online (Sandbox Code Playgroud)

这一次,如果我们改变Ninja可以做的事情:

Ninja.prototype.kill = function () {};
// OR,
defaultNinja.kill = function () {};
Run Code Online (Sandbox Code Playgroud)

实例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
Run Code Online (Sandbox Code Playgroud)