《你不知道的js》——原型

原型和原型链

[[Prototype]] 机制就是指对象中的一个内部链接引用 另一个对象
原型:内置属性,所有的对象在创建时 Prototype属性都会被赋予一个非空的值。
原型链:如果调用myObject.a,但是 a 不在 myObject 中,就会访问对象的原型链。

如何解决:创建一个关联到 anotherObject 的对象,而这个对象有a属性

  1. var myObject = Object.create( anotherObject );
    如果anotherObject也不存在a,则顺着原型链继续查找;
    如果查找完整条原型链都没有的话就返回undefined

  2. Object.setPrototypeOf( Bar.prototype, Foo.prototype );

原型链功能

原型链的尽头是Object.prototype 对象,该对象的功能:
.toString()
.valueOf(),
.hasOwnProperty(…)。
.isPrototypeOf(…),

修改属性值时发生的机制

A.myObject.foo = “bar”
B.Object.defineProperty(myObject,”foo”,{
value:”bar”,
writable: true,
configurable: true,
enumerable: true})
}

If(当前调用的对象myObject中包含的 foo 属性)
{
会屏蔽原型链上层的所有 foo 属性,因为 myObject.foo总是会选择原型链中最底层的 foo 属性
}
else //当前没有但上层有foo
{
	If(foo !=只读)
	{
	在myObject中添加为新的属性(屏蔽属性)
	}
	else if(foo==只读)//可以通过B屏蔽上层foo,在myObject中添加为新的属性
	{
		  Error
	}
	else if(foo==setter){//可以通过B屏蔽上层foo,在myObject中添加为新的属性
		  调用setter
	}
}
//注意:myObject.a++;  隐式屏蔽!形成新的属性

.constructor

.constructor是函数声明时的默认属性,指向内置的object函数,不能被构造,不可枚举,可写,不安全,不要用

判断类的关系

对象和函数之间:

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

对象和对象之间

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

获取原型的方式

  1. Object.getPrototypeOf( a )(用于遍历原型链,类似于setter/getter)
    Object.getPrototypeOf( a ) === Foo.prototype; // true
  2. a.proto === Foo.prototype; // true

原型作用

备用对象调用关联对象的属性

  1. Proxy
  2. API设计的内部委托方式
    var anotherObject = {
    cool: function() {
    console.log( “cool!” );
    } };
    var myObject = Object.create( anotherObject );
    myObject.doCool = function() {
    this.cool(); // 内部委托! };
    myObject.doCool(); // “cool!”
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值