一、原型:每一个构造函数都有一个prototype属性,这个属性会在生成实例的时候,成为实例对象的原型对象;JavaScript
的每个对象都继承另一个对象,后者成为原型(prototype)对象。
1、所有的引用类型(数组、函数、对象)可以自由扩展属性;(null除外)
2、所有的引用类型都有一个“__proto__”属性,也叫隐式原型;
3、所有的函数都有一个“prototype”属性,也叫显式原型;
4、所有引用类型的“__proto__”属性,指向它的“prototype”原型对象;prototype原型对象
5、获取对象的属性时,如果对象本身不存在这个属性,那么就会找它的“__proto__”属性,也就是构造函数的“prototype”属性;
二、原型链:对象的属性和方法,有可能定义在自身,也有可能定义在它的原型对象。由于原型本身也是对象,又有自己的原型,所以形成了一条原型链(prototype chain)。每一个JS函数中都有一个prototype(原型)属性,指向这个函数的原型对象,通过这个函数产生的实例对象都有一个__proto__(隐式原型)属性,这个属性也是指向同一个原型对象,所有的实例对象的属性都会继承这个原型对象的属性,原型对象上也有一个__proto__属性,指向的objec原型对象,所有的对象属性都会继承objec原型对象属性。而object原型对象的__proto__指向的是null。
三、继承:继承是指一个对象直接使用另一个对象的属性和方法
在JavaScript中实现继承的方法:
1. 原型链(prototype chaining)
function person(name){
this.name = name;
}
person.prototype.getName = function(){
console.log("name is "+this.name);
}
var oname = new person("小明");
oname.getName(); // name is 小明
function oPerson(name){
this.name = name;
}
oPerson.prototype = new person();
var oname2 = new oPerson("小红");
oname2.getName(); // name is 小红
2. call()/apply()
function useCall(a,b){
this.a = a;
this.b = b;
this.say = function(){
console.log("I'm "+this.a+" You're "+this.b);
}
}
function callThefunction (a,b){
var args = arguments;
useCall.call(this,a,b);
//useCall.apply(this,arguments);
}
var testCall1 = new useCall("Not AA","Not BB");
testCall1.say(); // I'm Not AA You're Not BB
var testCall2 = new callThefunction("AA","BB");
testCall2.say(); // I'm AA You're BB
3. 混合方式(prototype和call()/apply()结合)
function house(size,price){
this.size = size;
this.price = price;
}
house.prototype.showHouse=function (){
console.log("面积为"+this.size + ";价钱为"+this.price);
}
function ohouse(size,price){
house.call(this,size,price);
}
ohouse.prototype = new house();
var newhouse = new ohouse("100m²","1000000$");
newhouse.showHouse(); //面积为100m²;价钱为1000000$
4. 对象冒充
function Person(name,age){
this.name = name;
this.age = age;
this.show = function(){
console.log("I is "+this.name+",my age is "+this.age);
}
}
function Student(name,age){
this.student = Person; //将Person类的构造函数赋值给this.student
this.student(name,age); //js中实际上是通过对象冒充来实现继承的
delete this.student; //移除对Person的引用
}
var s = new Student("小明",17);
s.show(); // I is 小明,my age is17