美文网首页程序员
javascript原型——属性设置和屏蔽

javascript原型——属性设置和屏蔽

作者: Y_d4ea | 来源:发表于2019-05-09 10:39 被阅读8次

[[Prototype]]

JavaScript 中的对象有一个特殊的 [[Prototype]] 内置属性,其实就是对于其他对象的引
用。几乎所有的对象在创建时 [[Prototype]] 属性都会被赋予一个非空的值。

[[Prototype]]作用:

1.试图引用对象的属性时会触发[[Get]] 操作
2.如果无法在对象本身找到需要的属性,就会继续访问对象
的 [[Prototype]] 链

var anotherObject = { a:2
};
// 创建一个关联到 anotherObject 的对象
var myObject = Object.create( anotherObject ); myObject.a; // 2
// Object.create()可理解成继承一个对象,添加的属性是在原型链下
// 添加的值不是自身的,通过原型链proto来访问

3.如果 anotherObject 中也找不到 a 并且 [[Prototype]] 链不为空的话,就会继续查找 下去。这个过程会持续到找到匹配的属性名或者查找完整条 [[Prototype]] 链。
4.所有普通的 [[Prototype]] 链最终都会指向内置的 Object.prototype。由于所有的“普通” (内置,不是特定主机的扩展)对象都“源于”(或者说把 [[Prototype]] 链的顶端设置为)这个Object.prototype 对象,所以它包含 JavaScript 中许多通用的功能。

属性设置和屏蔽
myObject.foo = "bar";
  1. 如果在[[Prototype]]链上层存在名为foo的普通数据访问属性并且没有被标记为只读(writable:false),那就会直接在myObject 中添加一个名为foo 的新 属性,它是屏蔽属性。
  2. 如果在[[Prototype]]链上层存在foo,但是它被标记为只读(writable:false),那么 无法修改已有属性或者在myObject 上创建屏蔽属性。如果运行在严格模式下,代码会抛出一个错误。否则,这条赋值语句会被忽略。总之,不会发生屏蔽。
  3. 如果在[[Prototype]]链上层存在foo并且它是一个setter,那就一定会 调用这个setter。foo不会被添加到(或者说屏蔽于)myObject,也不会重新定义 foo 这 个setter。

例如:

var anotherObject = {
  a: 2
};
var myObject = Object.create(anotherObject);
anotherObject.a; // 2
myObject.a; // 2
anotherObject.hasOwnProperty("a"); // true
myObject.hasOwnProperty("a"); // false
myObject.a++; // 隐式屏蔽!
anotherObject.a; // 2
myObject.a; // 3
myObject.hasOwnProperty("a"); // true

通俗易懂来说:
1.myObject.a++分解为myObject.a=myObject.a+1,
实际上就是myObject.a=3。
2.用 [[Put]] 将值 3 赋给 myObject 中新建的屏蔽属性 a。
(如图,第一个对象为myObject,第二个对象为myObject)


WX20190509-103713@2x.png

注意:修改委托属性时一定要小心。如果想让 anotherObject.a 的值增加,唯一的办法是 anotherObject.a++。

相关文章

  • javascript原型——属性设置和屏蔽

    [[Prototype]] JavaScript 中的对象有一个特殊的 [[Prototype]] 内置属性,其实...

  • Javascript:内部属性[[Prototype]]

    从上一篇文章JavaScript:prototype属性,我们知道了在Javascript中,原型是用来设置一个构...

  • JS中的原型我们来搞懂它

    原型是什么? JavaScript对象可以从其他对象那里继承属性和行为,更具体的来说,JavaScript使用原型...

  • 原型和原型链

    原型 javascript中每个JS对象一定对应一个原型对象,并从通过proto属性原型对象继承方法和属性 jav...

  • 创建对象

    JavaScript对每个创建的对象都会设置一个原型,指向它的原型对象。 当我们用obj.xxx访问一个对象的属性...

  • 原型之对象属性的设置与屏蔽

    我们现在考虑这么一种情况,假设有一个对象obj,我们要对其进行动态增加一个属性a,但是对象obj的[[Protot...

  • Prototype

    bp[ 原型最重要的是为了share(共享), 共享一些方法和属性。 原型Prototype JavaScript...

  • Javascript-原型与原型链

    简单介绍 JavaScript 每个对象都拥有一个原型对象,对象以其原型为模板从原型中继承方法和属性; 原型对象也...

  • 个人对面向对象的理解

    我对原型和原型链式这样理解的,原型和原型链在javascript当中主要用来体现对象 与属性之间的关系,它主要应用...

  • JavaScript学习笔记7_对象_4对象的原型(protot

    原型属性(prototype) 对象的原型属性是用来继承属性的。在对象创建时原型属性就已经设置好了,(参考创建对象...

网友评论

    本文标题:javascript原型——属性设置和屏蔽

    本文链接:https://www.haomeiwen.com/subject/xlrcoqtx.html