美文网首页
原型之对象属性的设置与屏蔽

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

作者: BIGHAI | 来源:发表于2017-05-28 16:35 被阅读0次

我们现在考虑这么一种情况,假设有一个对象obj,我们要对其进行动态增加一个属性a,但是对象obj的[[Prototype]]原型链上面有属性a,那么我们为对象obj动态添加属性a是否一定会发生屏蔽现象呢?(即动态添加完之后,对象自身的a属性覆盖了原型链上的属性a)

对于上面这个问题,相信大部分人都会回答会屏蔽掉。然而事实并非如此,涉及到这种情况时的屏蔽问题会变得更加复杂。下面详细分析一下JavaScript对此做出的响应会有哪些:

  • 1.如果在[[Prototype]]原型链上的那个同名属性的属性描述符writable被设置为true的话,那么就会直接在obj上动态添加这个属性。此时,会发生屏蔽工作。
Object.defineProperty(Object.prototype, "a", {
  "value": "protoValue",
  "writable": true,
  "enumerable": true,
  "configurable": true
})
var obj = {"b": 2}
console.log(obj.a)//"protoValue"
obj.a = "selfValue"
console.log(obj.a)//"selfValue"
  • 2.如果在[[Prototype]]原型链上的那个同名属性的属性描述符writable被设置为false的话,那么在obj上动态增加这个属性将没有效果,不会发生屏蔽工作。在严格模式下,这样做会报错。
//"use strict";加上这句后报错
Object.defineProperty(Object.prototype, "a", {
  "value": "protoValue",
  "writable": false,
  "enumerable": true,
  "configurable": true
})
var obj = {"b": 2}
console.log(obj.b)//protoValue
obj.a = "selfValue"
console.log(obj.a)//protoValue

1.隐式屏蔽

有些情况下会发生隐式屏蔽,这个时候真的让人猝不及防,一不留神就造成了个错误。看下面这个例子:

var source_object = {"a": 2}
var target_object = Object.create(source_object)
console.log(source_object.a)//2
console.log(target_object.a)//2
source_object.hasOwnProperty("a")//true
target_object.hasOwnProperty("a")//false
target_object.a++//隐式屏蔽
source_object.a//2
target_object.a++//3
target_object.hasOwnProperty("a")//true

分析:可以这样理解target_object.a = target_object.a + 1;由于[[Prototype]]原型链上的a属性的属性描述符writable的值时true,所以此时发生了屏蔽现象。

END

相关文章

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

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

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

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

  • 对象的三个属性

    每一个对象都有与之相关的原型、类、可扩展性。这就是对象的三个属性 原型属性 对象的原型属性是是用来继承属性的。 类...

  • JavaScript 学习笔记 (3) - 对象的属性

    区分对象实例自身属性还是原型属性 有什么区别呢?对象自身的属性可以访问 (读),也可以设置(写)。而原型的属性,则...

  • JavaScript 学习

    JS 原型与原型链 每个对象都有 __proto__属性,但只有函数对象才有 prototype 属性 所有对象的...

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

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

  • __proto__, [[prototype]] , proto

    原型是构造函数上的属性,该函数设置将成为构造对象的proto属性。 每个对象都可以有另一个对象作为其原型。然后,前...

  • javascript中面向对象编程-创建对象之原型模式

    理解名词:对象 原型对象 原型属性 函数 构造函数 实例 对象: Object,创建对象,对象属性方法原型对象:...

  • 3.原型链、eval、Function等用法

    原型 原型本身是一个对象,这个对象的属性与方法可供其他对象。 谁有原型 默认所有的对象都有原型 谁有prototy...

  • 原型概念

    神秘对象称与构造函数 神秘对象就是构造函数的 "原型属性"简称原型 (构造函数的原型) 神秘对象与构造函数所创建出...

网友评论

      本文标题:原型之对象属性的设置与屏蔽

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