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
设置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!
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)
| 归档时间: |
|
| 查看次数: |
119 次 |
| 最近记录: |