我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个对象,它的用途是包含可以由特定的类型的所有实例共享的属性和方法。逻辑上可以这么理解:prototype通过调用构造函数而创建那个对象的原型对象。使用原型的好处是可以让所有的对象实例共享它所包含的属性和方法。也就是说,不必在构造函数中定义对象信息,而是可以直接将这些信息添加到原型中。
//原型
function Box(){} //构造函数内什么都没有,如果有,叫做实例属性,实例方法
Box.prototype.name = 'tom'; //原型属性
Box.prototype.age = 100;
Box.prototype.run = function(){ //原型方法
return this.name + this.age + '运行中...';
};
var box1 = new Box();
alert(box1.run());
//如果是实例方法,不同的实例化,它们的方法地址是不一样的,是唯一的
//如果是原型方法,它们的地址是共享的,大家都是一样的
var box2 = new Box();
alert(box1.run == box2.run); //true
alert(box1.prototype); //这个属性是一个对象,访问不到
alert(box1.__proto__); //[Object Object] 这个属性是一个指针指向prototype原型对象 在IE中不支持
alert(box1.constructor); //function Box(){} 构造属性,可以获得构造函数本身
//作用是被原型指针定位,,然后得到构造函数本身
//其实就是构造函数对象对应的原型对象的作用
在原型模式声明中,多了两个属性,这两个属性都是创建对象时自动生成的。__proto__属性是实例指向原型对象的一个指针,它的作用是就是指向构造函数的原型属性constructor。通过这两个属性,就可以访问到原型里面的属性和方法了。
PS:IE浏览器在脚本访问__proto__会不能识别,火狐及谷歌浏览器以及其他某些浏览器均能识别。虽然可以输出,但无法获取内部信息。
判断一个对象