原型链理解图
复习原型链时看到比较好的几幅图,在此收藏一下。
表示原型对象,构造函数和实例对象的关系图:
原型链图1:
原型链图2:
对象的constuctor属性
返回创建实例对象的 Object
构造函数的引用。注意,此属性的值是对函数本身的引用,而不是一个包含函数名称的字符串。对原始类型来说,如1
,true
和"test"
,该值只可读。
所有对象都会从它的原型上继承一个 constructor
属性。
依赖一个对象的 constructor
属性并不安全。
大多数情况下,此属性用于定义一个构造函数,并使用new和继承原型链进一步调用它。
1 | function Parent() {} |
手动设置或更新构造函数可能会导致不同且有时令人困惑的后果。为了防止它,只需在每个特定情况下定义构造函数的角色。在大多数情况下,不使用构造函数,并且不需要重新分配构造函数。
instanceof运算符
instanceof
运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype
属性。
语法: object instanceof constructor
参数:object-要检测的对象;constructor-某个构造函数
描述:instanceof
运算符用来检测 constructor.prototype
是否存在于参数 object
的原型链上。
Objet.create()
Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的proto。
语法:
1 | Object.create(proto, [propertiesObject]) |
参数:
proto 新创建对象的原型对象。
propertiesObject 可选。如果没有指定为 undefined
,则是要添加到新创建对象的可枚举属性(即其自身定义的属性,而不是其原型链上的枚举属性)对象的属性描述符以及相应的属性名称。这些属性对应Object.defineProperties()
的第二个参数。
返回值:一个新对象,带着指定的原型对象和属性。
如果propertiesObject
参数不是 null
或一个对象,则抛出一个 TypeError
异常。
Object.create()相当于:
1 | function create(o){ |
在 object()函数内部,先创建了一个临时性的构造函数,然后将传入的对象作为这个构造函数的 原型,最后返回了这个临时类型的一个新实例。 从本质上讲, object()对传入其中的对象执行了一次 浅复制。在传入一个参数的情况下, Object.create()与 object()方法的行为相同。
例子
用 Object.create
实现类式继承
下面的例子演示了如何使用Object.create()
来实现类式继承。这是一个所有版本JavaScript都支持的单继承。
1 | // Shape - 父类(superclass) |
如果你希望能继承到多个对象,则可以使用混入的方式。
1 | function MyClass() { |
Object.assign 会把 OtherSuperClass
原型上的函数拷贝到 MyClass
原型上,使 MyClass 的所有实例都可用 OtherSuperClass 的方法。Object.assign 是在 ES2015 引入的,且可用 polyfilled。要支持旧浏览器的话,可用使用 jQuery.extend() 或者 _.assign()。
使用 Object.create
的 propertyObject
参数
1 | var o; |
参考链接:
https://segmentfault.com/q/1010000005182807
js高级程序设计