JS-Object 对象原型

通过原型这种机制,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
JS-Object 对象原型_第1张图片
image.png
image.png

你可能感兴趣的:(JS-Object 对象原型)