Javascript对象是基于原型(prototype-based)的,我们创建的对象,看起来要像我们想要的所有这种类型的对象那样,类似于盖房子,先建好一所房子,然后将其它房子都建成像这种模样的。
创建对象的步骤:首先创建对象的模板(原型对象),然后创建构造函数,再把构造函数和原型关联起来,最后实例化对象。
var proto = {};
function Animal(name){
this.name= name;
this.speak= function(){};
}
Animal.prototype = proto;
var cat = new Animal(‘Jimmy’);
使用new操作符创建对象,有点违背了基于原型的核心思想,我们可以用Object.create();代替
var proto = {};
var cat = Object.create(proto);
cat.name = ‘Jimmy’;
cat.speak = function(){};
这里的Object.create();在IE9以下都不支持,需要我们自己添加。其实这个方法就是帮我们把原型和对象关联起来了,我们完全可以自己实现一个。
var objectCreate = function(arg){
if(!arg){ return {}; }
functionobj(){}
obj.prototype =arg;
return newobj();
}
Object.create = Object.create ||objectCreate;
Javascript使用原型链来解析属性值(方法其实也是属性,就是把函数赋给属性,这个函数就成了方法),当请求对象的属性时,首先直接在该对象上查找,如果找到了,直接返回这个值,如果找不到,则查找对象的原型,如果在原型上也找不到,就查找原型的原型,以此类推。当找到Object.prototype时,原型链就结束了。如果在原型链的所有地方都找不到属性,就返回undefined。
总之,原型链可以概括为以下几句话,结合图片能更好的理解。
1、内置对象和自定义函数的__proto__都指向Function.prototype,也就是说,内置对象和自定义函数都可以看做Function的实例。
2、自定义函数的原型对象的__proto__和Function.prototype.__proto__都是指向Object.prototype的。
3、Object.prototype是终点,到此结束,也就是说Object.prototype.__proto__是null。
4、双对象:构造函数、原型对象
构造函数的prototype指向原型对象,原型对象的constructor指向构造函数。
5、实例出来的对象没有prototype,它通过__proto__指向原型对象。