JavaScript 中的 prototype

我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象(如图中的Person.prototype对象),而这个对象包含所有实例共享的属性和方法。

function Person () {
  this.nation = '中国'
}
Person.prototype.name="Nicholas";
typeof Person.prototype // "object"
Person.prototype{
  constructor:Foo()
  name:"Nicholas"
  __proto__:Object
}
Person.prototype.__proto__{
  constructor:Object()
  hasOwnProperty:hasOwnProperty()
  isPrototypeOf:isPrototypeOf()
  propertyIsEnumerable:propertyIsEnumerable()
  toLocaleString:toLocaleString()
  toString:toString()
  valueOf:valueOf()
  ...
}
var Person1=new Person();
typeof Person1.prototype // "undefined"
typeof Person1.__proto__ // "object"
Person1.name // "Nicholas"
Person1.nation // "中国"

这里的Person1.__proto__指向Person.prototype对象,this 会指向新的实例,Person1Person构造函数中复制了一个career属性。如果新建多个实例,就相当于从Person构造函数复制了多个career属性,这种做法对内存是很不友好的,所以一般会将公用的属性写在prototype对象中。

JavaScript 中的 prototype_第1张图片

这里的__proto__并不是一个标准的属性,它表示对象的原型。

你可能感兴趣的:(JavaScript 中的 prototype)