constructor prototype

万能的例子

function Rectangle(x,y){
    this.x = x;
    this.y = y;
}
Rectangle.prototype.perimeter=function(){
    return 2*(this.x+this.y);
}
var rectangle = new Rectangle();

一个对象的原型与对象的 prototype属性不是一回事

前者用于在原型链中匹配不存在的属性。后者用于通过 new 关键字创建对象,它将作为新创建对象的原型。
以最初的例子为例,rectangle的原型是Rectangle.prototype。转换成代码就是下面这句话。

// DEPRECATED. This is for example purposes only. DO NOT DO THIS in real code.
//如果确实需要,请用Object.getPrototypeOf(rectangle)代替rectangle.__proto__ 
rectangle.__proto__ = Rectangle.prototype;

new 操作符到底做了什么?

When the code new Foo(...) is executed, the following things happen:

  1. A new object is created, inheriting from Foo.prototype.(inheriting我的理解是新对象的原型,即proto,也即Object.getPrototypeOf(新对象),指向Foo.prototype,j)
  2. The constructor function Foo is called with the specified arguments, and with this bound to the newly created object. new Foo is equivalent to new Foo(), i.e. if no argument list is specified, Foo is called without arguments.
  3. The object returned by the constructor function becomes the result of the whole new expression. If the constructor function doesn't explicitly return an object, the object created in step 1 is used instead. (Normally constructors don't return a value, but they can choose to do so if they want to override the normal object creation process.)

比如当你执行

var o = new Foo();
var o = new Object();//创建一个新对象
o.__proto__ = Foo.prototype;//新对象的原型执行构造函数的prototype属性
var ret = Foo.call(o);//执行构造函数,并将this绑定为新创建的对象。
if(typeof Foo()==="object"){//如果返回值是一个对象
    o=Foo();//返回值将覆盖o
}

为什么实例的属性不写在原型链上,而写在this.xxx里面,而方法要写在构造函数的prototype属性上。

因为每次创建实例的时候会new 构造函数,是对构造函数中实例变量,实例方法的一次完全复制。而方法都是在做完全一样的功能,没有必要复制那么多次,于是就统一写在了构造函数的prototype上。

属性写在this.xxx里面,是为了属性私有。每个实例都有它特定的属性,new 构造函数的时候通过参数传入属性。

  1. 让属性支持传参数进行控制,不写死。
  2. 查找原型链更耗费时间。(其实完全可以忽略)

内部原型引用

对象中保存原型的变量,也被称之为内部原型引用(the internal prototype link),历史上也曾称之为 __proto__ ,对这个称谓始终存在一些争议。 更精确的,它可以被称为 Object.getPrototypeOf(...) 的返回值。

constructor

注:constructor属性并非一定指向构造函数,他也是可以修改、变更的。

参考文献

  1. javascript prototype
  2. 继承与原型链
  3. JavaScript中_ proto _与prototype的关系

你可能感兴趣的:(constructor prototype)