原型:
定义:
原型是function 对象(构造函数)的一个属性,他定义了构造函数制造出的对象的公共祖先,通过该构造函数产生的对象,可以继承原型的属性或方法,原型本身也是对象。
当许多个体都有相同的属性名和属性值时,我们可以选择把他们提到原型里。(提取共有属性)。
另附对象查看对象的构造函数方法:
object. constructor;
var obj = {name:'a'};
var obj1 = obj;
obj = {name:'b'};
看看直接赋值的对象改变属性值会不会影响原对象呢?
答案是不会,因为obj相当于换了一个‘房间’
那如果把第三行代码换成obj.name = 'b'
呢?
那结果就不一样了,其实第二行的复制操作并不应该是单纯的复制,引用一下“JavaScript 默认并不会复制对象的属性,相反,JavaScript 只是在两个对象之间创建一个关联”
再补充一种创建对象的方法:
var obj = {…};
var obj1 = Object.create(obj);
这样,obj1会成为一个里面无属性,但是原型是obj里的属性和原型的一个对象。
所以也就我们掌握了一个创建彻底空对象的方法:让obj里面为null,不能写空对象{},否则会报错。
现在是干货了,注意理清思路
function Obj (){
}
var obj = new Obj();
首先,通过构造函数Obj()创建一个对象obj,那么obj,可以叫做一个对象,也可以说是一个实例。这个实例是由Obj()函数所创建出来的。obj的原型可以由Obj.prototype来访问,也可以由obj._proto_
去找到。但是这个方法是不标准的(虽然是这样,但是大多数浏览器也都能使),这里介绍一种ES5的方法:Object.getPrototypeOf(obj);可以直接访问到原型。从原型到实例的构造函数有没有方法呢?有的。刚才提到的 constructor,Obj.prototype.constructor == Obj;那么问题来了,为什么实例也可以使用constructor呢,其实实例上根本没有这个方法,他像是顺着某个链条找到了他原型上的constructor并使用。所以完全可以说
obj.constructor === Obj.prototype.constructor
原型链:
定义里有讲到,原型也是对象。那么是对象就一定有原型。原型的原型是什么呢
既然原型在这里作为实例,那么就用实例访问圆原型的方法访问他:Object.getPrototypeOf(Obj.prototype)
有如下结论Object.getPrototypeOf(Obj.prototype) === Object.prototype,
这完美迎合了咱们介绍的创建对象的方法中的var object = Object(),Object()作为构造函数,同样符合上述逐条规律。
所以我们说的原型链,用这个简单的例子就可以表示为:obj –> Obj.prototype –>Object.prototype._proto_
;
他们一级一级之间可以用_proto_
访问,那么Object.prototype的原型呢?
是null,他就是最顶级。
那么原型链可以手动实现吗?
Grand.prototype.look = 'handsome'
function Grand(){
this. name = 'Li'
}
function Father(){
this.money = 'very much';
}
var grand = new Grand();
var father = new Father();
function Son(){
}
Father.prototype = grand;
Son.prototype = father;
var son = new Son();
一个实例,已经测过无误,有兴趣可以把上面讲的方法测一测。
感谢访问!