js的每个对象都继承另一个对象,后者成为原型对象(prototype), 只有null没有自己的原型对象
原型对象上的所有属性和方法,都能被派生对象所共享这就是java继承机制的基本设计
通过构造函数生成实例对象是会自动分配原型对象,所以每一个构造函数都有一个prototype属性
这个属性就是实例对象的原型对象
function Food(name){
this.name = name;
}
Food.prototype.rule = 'energy';
var food1 = new Food('面包');
var food2 = new Food('牛奶');
构造函数Food的对象就是实例化对象为food1 和 food2 在原型对象上添加一个rule属性,结果就是所有的实例化对象都能读取该属性
可以通过改变Food.prototype.rule的值来改变实例化对象中的rule属性的值
原因:实例化对象没有rule这个属性,是读取原型对象的color属性,也就是说当实例化对象本身没有某个属性或方法时他会到构造函数prototype属性指向的对象中寻找属性和方法,这就是原型对象的特殊之处
如果实例对象自身就有某个属性和方法,则不会再去原型对象中寻找属性和方法
作用:就是定义所有实例化对象共有的属性和方法
Food.prototype.walk = function(){
consol.log(this.name + can eat);
}
所有的对象都有自己的原形对象
var MyArray = function(){};
MyArray.prototype = new Array();
var mine = new MyArray();
mine.push(1,2,3);
mine.length; //3
mine.instanceof Array; //true
instanceof又来比较一个对象是否为某个构造函数的实例
constructor属性
默认指向prototype对象所在的构造函数
function P(){}
P.prototype.constructor === p ;
//true
由于constructor属性定义在prototype上面,也就是说可以被所有的实例化对象继承
function F(){};
var f = new F();
f.constructor === F; //true
f.constructor === RegExp; //false
Object.getPrototypeOf() 获取对象原型的标准方法
Object.setPrototypeOf();设置对象原型返回一个对象