先来个简单的代码:typescript
function Info(name, age){
this.name = name;
this.age = age;
this.message = function () {
console.log(this.name + "is" + this.age + "year's old");
}
}
var lynn = new Info("Lynn", 20);
构造函数的首字母通常大写,用来区分于普通函数,使用 new 调用,没有返回值,获得的对象成为该函数的一个实例。
构造函数的prototype属性,称为原型属性,是一个隐藏属性,指向一个是object类型,称为原型对象。
构造函数原型对象的 constructor 属性 始终指向构造函数自己。 fn.prototype.constructor === fn;
当一个函数被用做构造函数来建立实例时,该函数的prototype属性值将被做为原型赋值给全部对象实例(也就是设置实例的proto属性),也就是说,全部实例的原型引用的是函数的prototype属性。
lynn.proto ===Info.prototype函数
在构造函数的原型上面附加的属性或者方法, 能够被其全部的实例共用.性能
当代码获取某个对象的属性时,首先会在对象实例自己内查找,若是查找不到,就会向上搜索其原型对象。为实例添加一个属性时,这个属性会屏蔽原型对象中的 同名属性。若想访问原型对象中的属性值,须要使用delete将这个同名属性在实例中完全删除。(注意:使用delete删除构造函数中的属性将把实例的原型对象中的属性也删除即若是把name放在Person()中,使用delete,person2的name将不存在)ui
function Info() {};
Person.prototype.name = 'Lily';
Person.prototype.age = 18;
var info1 = new Info();
var info2 = new Info();
info2.name = "Tom";
console.log(info1.name);// Lily
console.log(info2.name); // Tom
delete.info2.name;
console.log(info2.name); // Lilythis
一个属性可以访问时(不管是在实例仍是原型对象中)in操做符都会返回true,因此当in操做符返回true。hasOwnProperty("属性名")能够检测一个属性是存在于实例仍是原型对象中,其返回值true表明存在于实例中,false表明存在于原型对象中。spa
原型对象自己一样拥有一个内部属性 [[prototype]], 指向当前构造函数的构造函数的原型对象.
这种由原型对象构建而成的链表, 就是原型链.
原型链存在的意义, 在于尽量的共用方法和属性. 或者其余更多的我不知道的意义.
prototype
在JavaScript语言中,全部对象的原型链根节点都是Object.prototype。Object.prototype值是没法修改,它提供了一些默认的方法。且它的proto等于null!code
instanceof是一个二元运算符,如:A instanceof B. 其中,A必须是一个合法的JavaScript对象,B必须是一个合法的JavaScript函数 (function). 判断过程以下:对象
若是函数B在对象A的原型链 (prototype chain) 中被发现,那么instanceof操做符将返回true,不然返回false.ip
因此致使了:
Function instanceof Object; //true Object instanceof Function; //true Function instanceof Function; //true Object instanceof Object; //true
这样的状况发生!