原型、原型链、原型继承关系总结

一、原型:每一个构造函数都有一个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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值