繁体   English   中英

有关JavaScript中继承的问题

[英]Question regarding Inheritance in JavaScript

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

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();

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

  1. 设置Ninja.prototype = Person.prototype; 是说所有忍者都是人,所有人都是忍者 ,因为它只是使两个原型指向同一个东西。 因此,更改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!

实例 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()分为两个步骤。 首先,创建一个名为defaultNinja的新Person

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM