通过原型这种机制,JavaScript中的对象从其他对象继承功能特性,这种继承机制与经典的面向对象编程语言的继承机制不同。
JavaScript 常被描述为一种基于原型的语言(prototype-based language)--每个对象拥有一个原型对象,对象以其原型为模板、从原型继承方法和属性。原型对象也可能拥有原型,并从中继承方法和属性,一层一层、以此类推。这种关系常被称为原型链(prototype chain),它解释了为何一个对象会拥有定义在其他对象中的属性和方法。
准确的说,这些属性和方法定义在Object的构造器函数(constructor functions)之上的prototype
属性上,而非对象实例本身。
注意! 理解对象的原型(可以通过Object.getPrototypeOf(obj)
或者已被弃用的__proto__
属性获得)与构造函数的prototype
属性之间的区别是很重要的,前者是每个实例都有的属性,后者是构造函数的属性。也就是说,Object.getPrototypeOf(new Foobar())
和Foobar.prototype
指向同一个对象。
1、构造函数的prototype属性,继承成员被定义的地方
- 继承的属性和方法是定义在
prototype
属性上的(你可以称之为子命名空间)--那些以Object.prototype.
开头的属性而非仅仅以Object.
开头的属性。prototype
属性是一个对象,我们希望被原型链下游的对象继承的属性和方法都被储存在其中。 - 于是,
Object.prototype.watch() Object.prototype.valueOf()
等等成员,适用于任何继承自Object()
的对象类型,包括使用构造器创建的新的对象实例。 -
Object.keys() Object.is()
以及其他不在prototype
对象内的成员,不会被“对象实例”或“继承自Object()
的对象类型“所继承,这些方法/属性仅能被Object()
构造器自身使用. - 构造函数的
prototype
属性指向一个对象,在这个对象中定义需要被继承的成员。而原型对象(对象的原型)是一个内部对象,应该使用__proto__ 或 Object.getPrototypeOf(obj)
访问。
2、Object.create()方法创建新的对象
var person2 = Object.create(person1);
create()
实际做的是从指定原型对象创建一个新的对象。这里的person1
为原型对象创建了person2
对象,在控制台输入:person2.__proto__
结果返回person1
对象。
3、对象实例的constructor属性:指向创建该对象的构造函数
person1.constructor
person2.constructor
结果都返回Person()
构造器
- 你可以在
constructor
属性的末尾添加一对圆括号(括号中包含所需的参数),从而用这个构造器创建另一个对象实例。毕竟构造器是一个函数,故可以通过圆括号调用,只需要在前面添加new
关键字,便能将此函数作为构造器使用。
var person3 = new person1.constructor(参数...)
- 想要获得构造器对象的名字:
person1.constructor.name