You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
functionMyClass(){SuperClass.call(this);OtherSuperClass.call(this);}MyClass.prototype=Object.create(SuperClass.prototype);//inheritmixin(MyClass.prototype,OtherSuperClass.prototype);//mixinMyClass.prototype.myMethod=function(){// do a thing};
由于 ES5 里压根就没有 symbol 这种数据类型,所以这个 polyfill 也没必要去支持 symbol 属性(意思就是说,有 symbol 的环境一定有原生的 Object.assign):
if(typeofObject.assign!='function'){Object.assign=function(target){'use strict';if(target==null){thrownewTypeError('Cannot convert undefined or null to object');}target=Object(target);for(varindex=1;index<arguments.length;index++){varsource=arguments[index];if(source!=null){for(varkeyinsource){if(Object.prototype.hasOwnProperty.call(source,key)){target[key]=source[key];}}}}returntarget;};}
The text was updated successfully, but these errors were encountered:
以下内容引用自MDN
Object.create
Object.create() 方法使用指定的原型对象和其属性创建了一个新的对象。
语法
参数
proto
一个对象,应该是新创建的对象的原型。
propertiesObject
可选。该参数对象是一组属性与值,该对象的属性名称将是新创建的对象的属性名称,值是属性描述符(这些属性描述符的结构与Object.defineProperties()的第二个参数一样)。注意:该参数对象不能是 undefined,另外只有该对象中自身拥有的可枚举的属性才有效,也就是说该对象的原型链上属性是无效的。
抛出异常
如果 proto 参数不是 null 或一个对象值,则抛出一个 TypeError 异常。
例子
使用Object.create实现类式继承
下面的例子演示了如何使用Object.create()来实现类式继承。这是一个单继承。
如果你希望能继承到多个对象,则可以使用混入的方式。
mixin函数会把超类原型上的函数拷贝到子类原型上,这里mixin函数没有给出,需要由你实现。一个和 mixin 很像的函数是 jQuery.extend。
使用Object.create 的 propertyObject 参数
Polyfill
本polyfill的实现基于Object.prototype.hasOwnProperty。
Object.assign
Object.assign() 方法用于将所有可枚举的属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
语法
参数
target
目标对象。
sources
(多个)源对象。
返回值
目标对象。
描述
如果目标对象中的属性具有相同的键,则属性将被源中的属性覆盖。后来的源的属性将类似地覆盖早先的属性。
Object.assign 方法只会拷贝源对象自身的并且可枚举的属性到目标对象身上。该方法使用源对象的 [ [ Get ] ] 和目标对象的 [ [ Set ] ],所以它会调用相关 getter 和 setter。因此,它分配属性而不是复制或定义新的属性。如果合并源包含了 getter,那么该方法就不适合将新属性合并到原型里。假如是拷贝属性定义到原型里,包括它们的可枚举性,那么应该使用 Object.getOwnPropertyDescriptor() 和 Object.defineProperty() 。
String类型和 Symbol 类型的属性都会被拷贝。
注意,在属性拷贝过程中可能会产生异常,比如目标对象的某个只读属性和源对象的某个属性同名,这时该方法会抛出一个 TypeError 异常,拷贝过程中断,已经拷贝成功的属性不会受到影响,还未拷贝的属性将不会再被拷贝。
示例
复制一个 object
深度拷贝问题
针对深度拷贝,需要使用其他方法,因为 Object.assign() 拷贝的是属性值。假如源对象的属性值是一个指向对象的引用,它也只拷贝那个引用值。
合并 objects
继承属性和不可枚举属性是不能拷贝的
原始类型会被包装为 object
异常会打断接下来的拷贝任务
拷贝访问器(accessor)
Polyfill
由于 ES5 里压根就没有 symbol 这种数据类型,所以这个 polyfill 也没必要去支持 symbol 属性(意思就是说,有 symbol 的环境一定有原生的 Object.assign):
The text was updated successfully, but these errors were encountered: