欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Object.assign()扩展之实现原型链拷贝

程序员文章站 2023-11-27 16:47:28
object.assign()扩展-实现原型链拷贝 object.assign()的基本语法:将源对象(source)的所有可枚举属性的实例属性复制到目标对象(target)。 object.a...

object.assign()扩展-实现原型链拷贝

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进行处理,它的原型属性会被合并为实例属性。