Java script 原型_你不知道的JavasScript上篇·第五章·原型·下

5、差异继承

继承意味着复制操作;

差异继承:

基本原则是在描述对象行为时,使用其不同于普遍描述的特制。 (我的理解是只用对象自身的而不用普遍继承的像是toString(),valueOf()这种方法)

6、(原型) 继承

function Foo(name){

this.name = name;

}

Foo.prototype.myName = function(){

return this.name

}

function Bar(name,label){

//用call将name混合继承

Foo.call(this,name);

this.label = label;

}

//真正关联起来

Bar.prototype = Object.create(Foo.prototype);

Bar.prototype.myLabel = function(){

return this.label;

}

var a = new Bar('a','obj a');

a.myName();//a

a.myLabel();// obj a

此时Bar.prototype是:

5779f1902bd21bcfe8417e05e55006bb.png

Foo.prototype是:

6e4222467481c12381a3cf8ea7266ae1.png

这段代码的核心部分就是Bar.prototype = Object.create(Foo.prototype);调用Object.create()会凭空创建一个“新”对象并把新对象内部的[[Prototype]]关联到指定的对象(Foo.prototype)

两种方法可以将Bar.prototype关联到Foo.prototype,上面说的是第一种。

Es6提供了另一种方法: Object.setPrototypeOf(Bar.prototype,Foo.prototype)

7、检查“类”关系

1、instanceof 谁是谁的实例吗?返回结果为true/false

instanceof 回答的是:在a的整条[[Prototype]]链中是否有Foo.prototype指向的对象

function Foo(){

...

}

Foo.prototype.blah = ...

var a = new Foo();

a instanceof Foo;//true

2、Foo.prototype.isPrototypeOf(a);

isPrototypeOf()回答的是:在a的整条[[Prototype]]链中是否出现过Foo.prototype?

var b = {};

var a = {};

b.isPrototypeOf(a);//false b的原型链中没有出现过a.Prototype

8、对象关联

原型链:如果在对象上没有找到需要的属性或者方法引用,引擎就会继续在[[Prototype]]关联的对象上进行查找,同理,如果后者中也没有找到需要的引用就回继续查找它的[[Prototype]],以此类推。这一系列对象的链接称为“原型链”

创建关联:

上面提到过两种方法:

Object.create()

Object.setPrototype()(Es6新增)

但是Object.create()是es5中新增的,需要做兼容判断:

if(!Object.create){

Object.create = function(o){

function F(){}

F.prototype = o;

return new F();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值