Object.assign()扩展之实现原型链拷贝
程序员文章站
2022-04-29 21:01:20
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进行处理,它的原型属性会被合并为实例属性。
上一篇: loging日志的使用
下一篇: 都说花菜有营养,花菜吃了好吗有什么功效
推荐阅读
-
基于JavaScript实现的继承机制之原型链(prototype)的实现教程
-
基于JavaScript实现继承机制之构造函数+原型链混合方式的使用详解_javascript技巧
-
Object.assign()扩展之实现原型链拷贝
-
基于JavaScript实现继承机制之原型链(prototype chaining)的详解_javascript技巧
-
基于JavaScript实现继承机制之构造函数+原型链混合方式的使用详解_javascript技巧
-
基于JavaScript实现继承机制之原型链(prototype chaining)的详解_javascript技巧
-
基于JavaScript实现的继承机制之原型链(prototype)的实现教程