版权声明:如果这篇文章对你有所帮助,请点个赞~~~ https://blog.csdn.net/qq_35087256/article/details/82634816
Object.assign()的基本语法:将源对象(source)的所有可枚举属性的实例属性复制到目标对象(target)。
Object.assign( target, source1, source2, ... )
所以,Object.assign()复制的属性是有限制的:
- 只复制源对象的自身实例属性,不复制原型属性(继承属性);
- 只复制可枚举属性(enumerable:true)
看下面例子:
function Person(){
this.sex = 'man';
}
Person.prototype.name = 'hello';
var p = new Person();
var newP = Object.assign({}, p)
console.log( newP ); //Object {sex: "man"}
console.log( newP.sex ); //man
console.log( newP.name ); //undefined
仅仅使用Object.assign是无法复制到源对象的原型属性,需要对它的原型对象进行操作。
定义一个clone函数:
function clone(targetObj){
var targetProto = Object.getPrototypeOf(targetObj);
return Object.assign( Object.create(targetProto), targetObj);
}
function Person(){
this.sex = 'man';
}
Person.prototype.name = 'hello';
var p = new Person();
var newP = clone(p);
console.log( newP ); //Object {sex: "man"}
console.log( newP.sex ); //man
console.log( newP.name ); //hello
注意,下面这种写法是错误的:
function clone2(targetObj){
var targetProto = Object.getPrototypeOf(targetObj);
return Object.assign( targetProto, targetObj);
}
//这个时候newP 会发生变化,name不再是原型链上的继承属性
console.log( newP ); //{name: "hello", sex: "man"}
clone和clone2的区别在于:
clone是将原型的实例对象作为目标对象target进行处理,所以它的原型属性是保留的。
clone2是直接将原型对象作为目标对象target进行处理,它的原型属性会被合并为实例属性。