博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Object.create()对对象属性prototype和__proto__的影响
阅读量:5936 次
发布时间:2019-06-19

本文共 2303 字,大约阅读时间需要 7 分钟。

下面是一段判断信息详情是否有修改的逻辑,贴上项目展示:

clipboard.png

那么问题来了,大家自行脑补一下如何判断图片是否有修改。

一、下面看两道关于Object.create()的经典面试题

第1题

var a = { name: 'kelen' };var b = Object.create(a);b.name = 'boke';console.log(a.name);

第2题

var a = { person : { name: 'kelen' } };var b = Object.create(a);b.person.name = 'kobe';console.log( a.person.name );

思考

为什么第一个修改obj2的name属性,obj1的name输出是one,而第二个却可以改变呢?

二、解释:Object.create函数

Object.create()方法创建一个拥有指定原型和若干个指定属性的对象。

语法

Object.create(proto, [ propertiesObject ])

参数

proto

一个对象,作为新创建对象的原型。

propertiesObject

可选。该参数对象是一组属性与值,该对象的属性名称将是新创建的对象的属性名称,值是属性描述符(这些属性描述符的结构与Object.defineProperties()的第二个参数一样)。注意:该参数对象不能是 undefined,另外只有该对象中自身拥有的可枚举的属性才有效,也就是说该对象的原型链上属性是无效的。

抛出异常

如果 proto 参数不是 null 或一个对象值,则抛出一个 TypeError 异常

返回值

一个具有指定的内部原型且包含指定的属性(如果有)的新对象。

三、题目详解

Object.prototype 属性表示对象 Object 的原型对象。

__proto__ 属性表示对象 Object 的原型,原型的值可以是一个对象也可以为null,比如说Object.prototype.__proto__就是null

clipboard.png

从上面的例子分析,当var b = Object.create(a);的时候,不等同于b = a,实际上就是

b.__proto__ ==> a; b.prototype ==> a.prototype;

当我们对b.name = "kobe"的时候,实际上是在b对象新增一个属性,并且赋值,但是在b.name = "kobe"之前打印console.log(b.name);的时候输出"kelen"是因为在原型链去找到a的name属性,所以可以取到a的值

所以下面b.name = "kobe"并不会改变a的name属性,如果要实现a.name最后的值为kobe的话,可以这样写b.__proto__.name = "kobe";

而第二种情况,

b.person.name = "kobe"却可以改变a.person.name的值是因为,b.person是一个a.person的对象引用,当b.person.name进行赋值,实际上就是对a.person.name进行修改,举一个简单的引用类型的例子

var a = { name: "kelen" };var b = a;b.name = "kobe";console.log(a.name); // kobe

四、项目问题详解

第1题

var a = { name: 'kelen' };var b = Object.create(a);b.name = 'boke';console.log(a.name);  // kelen

第2题

var a = { person : { name: 'kelen' } };var b = Object.create(a);b.person.name = 'kobe';console.log( a.person.name ); // kobe

项目代码

//原始接口拿到的福利信息, //图片列表对象originInfo={    welfareName:'中影国际',    imageList:[        {            id:'5157',            wIFImgUrl:'http://tcw-wsq.b0.upaiyun.com/2016/07/12/34/20160713165313449.jpg'        },        {            id:'5158',            wIFImgUrl:'http://tcw-wsq.b0.upaiyun.com/2016/07/14/34/20160732112832397.jpg'        }    ]};//$scope.welfareInfo=originInfo;  //no,完全行不通//$scope.welfareInfo=Object.create(originInfo); //no,不可以var originInfoCy=JSON.stringify(originInfo);  //stringify用于从一个对象解析出字符串$scope.welfareInfo=JSON.parse(originInfoCy);  //parse 用于从一个字符串中解析出json 对象

对于这个问题正确的处理方法是,将originInfo对象转变成字符串,字符串并不是引用类型的,继而再转换成对象,它就完美解决问题啦啦。。。

转载地址:http://ptjtx.baihongyu.com/

你可能感兴趣的文章
JS中加载cssText延时
查看>>
常用的脚本编程知识点
查看>>
XILINX_zynq_详解(6)
查看>>
计算机网络术语总结4
查看>>
新手小白 python之路 Day3 (string 常用方法)
查看>>
soapUI的简单使用(webservice接口功能测试)
查看>>
框架 Hibernate
查看>>
python-while循环
查看>>
手机端上传图片及java后台接收和ajaxForm提交
查看>>
HDU 5030 Rabbit's String
查看>>
【MSDN 目录】C#编程指南、C#教程、ASP.NET参考、ASP.NET 4、.NET Framework类库
查看>>
jquery 怎么触发select的change事件
查看>>
angularjs指令(二)
查看>>
(原創) 如何建立一个thread? (OS) (Linux) (C/C++) (C)
查看>>
<气场>读书笔记
查看>>
实现一个平行四边形
查看>>
领域驱动设计,构建简单的新闻系统,20分钟够吗?
查看>>
web安全问题分析与防御总结
查看>>
React 组件通信之 React context
查看>>
ZooKeeper 可视化监控 zkui
查看>>