代码如下:

    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对象属性的赋值解析的更多相关文章

  1. Javascript对象属性与方法汇总

    Javascript对象属性与方法汇总 发布时间:2015-03-06 编辑:www.jquerycn.cn 详细介绍下,javascript对象属性与对象方法的相关知识,包括javascript字符 ...

  2. JavaScript对象属性的基础教程指南

    JavaScript是使用“对象化编程”的,或者叫“面向对象编程”的.所谓“对象化编程”,意思是把JavaScript能涉及的范围划分成大大小小的对象,对象下面还继续划分对象直至非常详细为止,所有的编 ...

  3. 删除要被替换的元素的所有事件处理 程序和 JavaScript 对象属性

    使用本节介绍的方法替换子节点可能会导致浏览器的内存占用问题,尤其是在 IE 中,问题更加明显.在删除带有事件处理程序或引用了其他 JavaScript 对象子树时,就有可能导致内存占用问题.假设 某个 ...

  4. JavaScript对象属性访问的两种方式

    JavaScript对象属性访问的两种方式 object.attribute object["attribute"] 例如: var employees = [ { "f ...

  5. JavaScript 对象属性

    JavaScript 对象属性 属性中的 . 和 [ ](点 和 方括号)的区别 .  :取对象自身的属性值: [ ]:括号内容可以是变量: var obj = {}; obj.name = 'Twx ...

  6. js 技巧 (六)JavaScript[对象.属性]集锦

    JavaScript[对象.属性]集锦 SCRIPT 标记 用于包含javascript代码. 语法 属性 LANGUAGE 定义脚本语言 SRC 定义一个URL用以指定以.JS结尾的文件 windo ...

  7. javascript对象属性和数组的访问

    javascript对象属性的访问 假如有对象test:var test = {  "a":1,  "b":2};直接访问对象test的属性a的值,有两种方法: ...

  8. 巧用javascript对象属性,向事件绑定的匿名函数内传递循环控制变量的值

    遇到一个需要向匿名函数传递循环控制变量的问题,我受到园子里这篇文章的启发[笔记]js获取当前点击元素的索引,解决了这个问题.现在把代码贴出来,以防止自己忘记. if ($('#labModal').l ...

  9. Javascript对象的方法赋值

    Javascript对象编程学习中,一直不能很好的掌握对象的属性(property)和方法(method).今天在写代码过程中,又犯了一个低级错误. <!DOCTYPE html> < ...

随机推荐

  1. UE4 编译后 不能正常使用Open Level 打开关卡解决方案:Open Level Blueprint Node not workin

    配置DefaultEditor.ini 文件 [AllMaps] +Map=/关卡文件路径   参考文献: https://answers.unrealengine.com/questions/141 ...

  2. Bower安装Bootstrap

    1.Bower简介 官网:https://bower.io/ Bower can manage components that contain HTML, CSS, JavaScript, fonts ...

  3. React Native组件之Switch和Picker和Slide

    React Native组件Switch类似于iOS中的UISwitch:组件Slide类似于iOS中UIslider,组件Picker类似于iOS的UIPickerView.他们的使用方法和相关属性 ...

  4. (实用篇)jQuery+PHP+MySQL实现二级联动下拉菜单

    二级联动下拉菜单选择应用在在很多地方,比如说省市下拉联动,商品大小类下拉选择联动.本文将通过实例讲解使用jQuery+PHP+MySQL来实现大小分类二级下拉联动效果. 先看下效果 大类:  前端技术 ...

  5. threadpool 的配置实用

    //spring mvc文件中的配置 <!-- ThreadPoolExecutor --> <bean id="threadPoolTaskExecutor" ...

  6. webservice可以访问但是不能调用方法

        <webServices>               <protocols>                 <add   name="HttpSoa ...

  7. CI框架 CodeIgniter 伪静态 htaccess设置和Nginx伪静态方法

    众所周知,LAMP代表Linux下Apache.MySQL.PHP这种网站服务器架构:而LNMP指的是Linux下Nginx.MySQL.PHP这种网站服务器架构.LNMP一键安装包可以从网上下载使用 ...

  8. Webview 与h5的交互

    步骤:H5代码   <html>   <head>   <meta charset="UTF-8">   <title>交互Demo ...

  9. 【转载】C/C++中#ifdef和#endif的用法

    转于 http://www.cnblogs.com/renyuan/archive/2013/05/22/3092362.html 今天笔试的时候遇到这个问题,整理一下! 一般情况下,源程序中所有的行 ...

  10. Correlation Filter in Visual Tracking系列一:Visual Object Tracking using Adaptive Correlation Filters 论文笔记

    Visual Object Tracking using Adaptive Correlation Filters 一文发表于2010的CVPR上,是笔者所知的第一篇将correlation filt ...