标签: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