《你不知道的Javascript--上卷 学习总结》(原型)
栏目: JavaScript · 发布时间: 5年前
内容简介:1、Javascript中的对象有一个特殊的[[Prototype]]内置属性,其实就是对于其他对象的引用。几乎所有的对象在创建时[[Prototype]] 属性都会被赋予一个非空的值。2、当我们获取一个对象的值的时候,首先会执行默认的[[Get]]操作来说,如果无法在对象本身找到需要的属性,就会继续访问对象的[[Prototype]]链3、所有普通的[[Prototype]]链最终都会指向内置的Object.prototype.
1、Javascript中的对象有一个特殊的[[Prototype]]内置属性,其实就是对于其他对象的引用。几乎所有的对象在创建时[[Prototype]] 属性都会被赋予一个非空的值。
2、当我们获取一个对象的值的时候,首先会执行默认的[[Get]]操作来说,如果无法在对象本身找到需要的属性,就会继续访问对象的[[Prototype]]链
3、所有普通的[[Prototype]]链最终都会指向内置的Object.prototype.
4、如果我们想给一个对象赋值的时候,这个属性既出现在myObject中也出现在myObject的[[Prototype]]链上层,那么就会发生屏蔽。如果不存在myObject上而是存在原型链上,会出现下面这些情况。
myObject.foo = 'bar' 复制代码
-
如果在
[[Prototype]]链上层
存在名为foo的普通数据访问属性
并且没有被标记为只读
,那就会直接在myObject中添加一个名为foo的新属性,它是屏蔽属性
-
如第一条,如果被标记为
只读
,则无法修改已有属性
或者在myObject上创建屏蔽属性
- 如果在[[Prototype]]链上层存在foo并且它是一个setter,那就一定会调用这个setter。foo不会被添加到myObject,也不会重新定义foo这个setter。
如果希望上面二和三条也发生屏蔽,就不能使用 =
操作符来赋值,而是使用Object.defineProperty来向myObject添加foo。
类
function Foo(){ } Foo.prototype.constructor === Foo // true var a = new Foo(); a.constructor === Foo // true 实际a上并没有constructor,而是通过prototype来查找到的Foo的constructor 复制代码
Foo.prototype默认有一个公有并且不可枚举的属性.constructor,这个属性引用的是 对象关联的函数
.
两种方法把Bar.prototype关联到Foo.prototype:
Bar.prototype = Object.create(Foo.prototype) Object.setPrototypeOf(Bar.prototype,Foo.prototype) 复制代码
instanceof 操作符的左操作数是一个 普通的对象
,右操作数是一个 函数
.判断左侧的对象是否是右侧函数的实例。
isPrototypeOf 判断左侧对象是否出现在右侧对象的[[prototype]]链中。
getPrototypeOf(a) 获取a的原型
b.isPrototypeOf(c) Object.getPrototypeOf(a) 复制代码
Object.create的polyfill代码(这个polyfill有一个问题,就是不支持第二个参数(属性描述符))
if(!Object.create){ Object.create = function(o) { function F(){} F.prototype = o; return new F(); } } var myObject = Object.create(anotherObject,{ b:{ enumerable:false, writable:true, configurable:false, value:3 } }) 复制代码
以上所述就是小编给大家介绍的《《你不知道的Javascript--上卷 学习总结》(原型)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 细读《你不知道的JavaScript·上卷》1-2 词法作用域
- 你不知道的JavaScript上卷-读书笔记 - 未完待续...不用点开了~
- 图解原型和原型链
- 创建对象、原型、原型链
- 构造函数、原型、原型链、继承
- JavaScript原型与原型链
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。