javascript对象属性的赋值解析
代码如下:
function Animal(){}
function Dog (age){
this.name = 'fuck you' ;
this.age = age
}
var dog = new Dog(12);
console.log(dog); //{name: "fuck you", age: 12}
Dog.prototype = Animal;
var dog2 = new Dog(12);
console.log(dog2);//{age: 12}
dog2对象的name属性不见了,why?
概念:
在segmentfault社区找到相关概念:
当为一个对象属性赋值是要遵循以下规则:
- 当对象的原型链中的原型对象上有对应的属性名,但是其是只读的,那么对象属性的赋值操作无效;
- 当对象的原型链中的原型对象上有对应的属性名,但是其是可写的,且设置了set方法,那么对象属性的赋值操作无效,转而调用调用原型对象中的属性的set方法;
- 当对象的原型链中的原型对象上有没有对应的属性名,那么直接在当前对象上添加这个属性(如果没有这个属性)并赋值。
解读:
Object.getOwnPropertyNames(Animal)
//["length", "name", "arguments", "caller", "prototype"]
//Animal有上述5个属性
Object.getOwnPropertyDescriptor(Animal, 'name')
//Object {value: "Animal", writable: false, enumerable: false, configurable: true}
//属性'name'只读,所以再次赋值无效
//通过知道属性只读,对象属性赋值操作无效,那么我们可以更改name的property-wirteable为true,如下
Object.defineProperty(Animal, 'name', {writable: true})
Object.getOwnPropertyDescriptor(Animal, 'name')
//Object {value: "Animal", writable: true, enumerable: false, configurable: true}
var dog3 = new Dog(13)
//Dog {name: "fuck you", age: 13}
//属性enumerable都为false,所以for in遍历不出来
Object.keys(Animal) //[]
//用ES6的Reflect
Reflect.ownKeys(Animal)
//["length", "name", "arguments", "caller", "prototype"]
Reflect.has(Animal,'name') //true
javascript对象属性的赋值解析的更多相关文章
- Javascript对象属性与方法汇总
Javascript对象属性与方法汇总 发布时间:2015-03-06 编辑:www.jquerycn.cn 详细介绍下,javascript对象属性与对象方法的相关知识,包括javascript字符 ...
- JavaScript对象属性的基础教程指南
JavaScript是使用“对象化编程”的,或者叫“面向对象编程”的.所谓“对象化编程”,意思是把JavaScript能涉及的范围划分成大大小小的对象,对象下面还继续划分对象直至非常详细为止,所有的编 ...
- 删除要被替换的元素的所有事件处理 程序和 JavaScript 对象属性
使用本节介绍的方法替换子节点可能会导致浏览器的内存占用问题,尤其是在 IE 中,问题更加明显.在删除带有事件处理程序或引用了其他 JavaScript 对象子树时,就有可能导致内存占用问题.假设 某个 ...
- JavaScript对象属性访问的两种方式
JavaScript对象属性访问的两种方式 object.attribute object["attribute"] 例如: var employees = [ { "f ...
- JavaScript 对象属性
JavaScript 对象属性 属性中的 . 和 [ ](点 和 方括号)的区别 . :取对象自身的属性值: [ ]:括号内容可以是变量: var obj = {}; obj.name = 'Twx ...
- js 技巧 (六)JavaScript[对象.属性]集锦
JavaScript[对象.属性]集锦 SCRIPT 标记 用于包含javascript代码. 语法 属性 LANGUAGE 定义脚本语言 SRC 定义一个URL用以指定以.JS结尾的文件 windo ...
- javascript对象属性和数组的访问
javascript对象属性的访问 假如有对象test:var test = { "a":1, "b":2};直接访问对象test的属性a的值,有两种方法: ...
- 巧用javascript对象属性,向事件绑定的匿名函数内传递循环控制变量的值
遇到一个需要向匿名函数传递循环控制变量的问题,我受到园子里这篇文章的启发[笔记]js获取当前点击元素的索引,解决了这个问题.现在把代码贴出来,以防止自己忘记. if ($('#labModal').l ...
- Javascript对象的方法赋值
Javascript对象编程学习中,一直不能很好的掌握对象的属性(property)和方法(method).今天在写代码过程中,又犯了一个低级错误. <!DOCTYPE html> < ...
随机推荐
- Windows Server 2008(R2)配置apache+php+mysql环境问题事项
服务器环境:Windows 2008 R2 64位.apache,mysql,php都是32位. 1. 80端口的外网访问问题 表现:80端口本地可以访问,外网不能访问,换了8080端口也是一样,检查 ...
- Hubilder快捷键
/* tips.txt的内容可以在HBuilder启动封面中显示.你可以自定义一个有趣的启动tips,增加[user]开头的文本内容即可.比如[user]我要减肥! */ 你按照Hello HBui ...
- H - R(N)
H - R(N) Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Sta ...
- 引用计数gc机制使用不当导致内存泄漏
上一篇文章找同事review了一下,收到的反馈是铺垫太长了,我尽量直入正题,哈哈 最近dbd压测时发现内存泄漏,其实这个问题去年已经暴露了,参见这篇博客[压测周].当时排查不够仔细,在此检讨下.关于d ...
- LA 4329 ping-pong树状数组
题目链接: 刘汝佳,大白书,P197. 枚举裁判的位置,当裁判为i时,可以有多少种选法,如果已经知道在位置i之前有ci个数比ai小,那么在位置i之前就有i-1-ci个数比ai大. 在位置i之后有di个 ...
- 评价photoshop
Adobe Photoshop,简称“PS”,是一个由Adobe开发和发行的图像处理软件. 2003年,Adobe的Creative Suite套装将Adobe Photoshop 8更名为Adobe ...
- javascript_获取浏览器属性
navigator.appName:浏览器名称: navigator.appVersion:浏览器版本: navigator.language:浏览器设置的语言: navigator.platform ...
- Jquery tab 选项卡 无刷新切换
转载的 演示地址:http://www.freejs.net/demo/29/index.html 首页>>TAB标签>>jquery实现简单的Tab切换菜单(2013-09- ...
- Visual Studio技巧之打造拥有自己标识的代码模板
可能经过很多博客的介绍,大家都知道代码段的使用,使用代码段可以很方便地生成一些常用的代码格式,确实对我们开发很方便.在团队开发中或者在某些情况下我们经常可能还会希望使用Visual Studio生成的 ...
- linux下mysql远程访问
// */ // ]]> linux下mysql远程访问 Mysql默认root用户只能本地访问,不能远程连接管理mysql数据库,但项目中必须要远程导 入导出数据,所以研究了一下. Tab ...