标签:log width alert 忽略 png 使用 完成 desc 1.3
<script> /* 创建包含原型链的实验对象obj1-- start */ function inheritPrototype(subType, superType) { var prototype = Object(superType.prototype); prototype.constructor = subType; subType.prototype = prototype; } function SuperType(name) { this.name = name; this.colors = [‘red‘, ‘yellow‘, ‘black‘]; } SuperType.prototype.sayName = function() { alert(this.name); } function SubType(name, age) { SuperType.call(this, name); this.age = age; } inheritPrototype(SubType, SuperType); SubType.prototype.sagAge = function() { alert(this.age); }; var obj1 = new SubType(‘puppy‘, 12); /* 完成实验对象obj1的创建 --end */ /* 原型拷贝-- start */ var obj2 = Object.getPrototypeOf(obj1); var obj3 = Object.assign(Object.create(obj2), obj1); /* 原型拷贝-- end */ console.log(obj1); console.log(obj2); console.log(obj3); </script>
function clone(origin) { return Object.assign({}, origin); } function moreClone(origin) { let oriProto = Object.getPrototypeOf(origin); return Object.assign(Object.create(oriProto), origin); }
如上图,对obj1的colors数据插入一个值,数组的length增1;同时,发现obj3的length也增加了1。浅拷贝得证。
jquery的$.extend实现的深度拷贝可通过for...in实现,也就是其深拷贝是对自身的与继承的可枚举属性进行~其丢掉了原型链。所以,原型拷贝与深拷贝之间有所区别,可根据需要进行选择。在使用原生JS的环境下,可通过for...in来实现深拷贝。
将obj1深拷贝给obj4,如下:
let obj4 = {}; $.extend(true, obj4, obj1); console.log(obj4);
chrome控制台输出如下:
该结构与通过for...in输出的obj1的结构相同,其丢失了obj1当中的继承的原型属性。(此处的__proto__为对象基础类型的原型属性,而非继承自自类的原型属性)。
对obj1复杂类型colors插入值,obj4不受影响。深拷贝,得证。
所以,通过for...in可实现深拷贝、Object.create()结合Object.getPrototypeOf()、Object.assign()实现原型拷贝。
var obj = {}; Object.defineProperty(obj, ‘test‘, { configurable: false, enumerable: false, get() { return this._value; }, set(value) { this._value = value + ‘ yeap‘; return true; } }); console.log(obj.property1) //undefined obj.test = 2 console.log(obj.property1) // 2 yeap
Object.defineProperties(obj, { test1: { configurable: false, enumerable: false, get() { return this._value; }, set(value) { this._value = value + ‘ yeap‘; return true; } }, test2: { value: ‘cutcut’, writable: true } });
Object的原型拷贝-create、assign、getPrototypeOf 方法的结合
标签:log width alert 忽略 png 使用 完成 desc 1.3
原文地址:http://www.cnblogs.com/chaoyuehedy/p/8000214.html