title: 面向?qū)ο?八)繼承___ 02原型式繼承 # 文章頁面上的顯示名
date: # 文章生成時間,一般不改
categories: # 文章分類目錄略就,可省略
- 面向?qū)ο?br>
tags: # 文章標(biāo)簽表牢,可省略
- 面向?qū)ο?br>
- 基于原型面向?qū)ο蟮睦^承 # 個數(shù)不限,單個可直接跟在 tags 后面
-
原型式繼承原理
原理:利用構(gòu)造函數(shù)的原型對象上面的屬性和方法可以被構(gòu)造函數(shù)創(chuàng)建出來的對象所擁有
-
原型式繼承的實現(xiàn)方式【3】
A · 利用對象的動態(tài)特性添加屬性
B · 替換(字面量的方式)原型對象
C · B.prototype = A.prototype;
** B.prototype = A.prototype; 存在的問題:**
001 構(gòu)造器屬性指向(默認指向的是父構(gòu)造函數(shù))
002 無法獲得實例屬性和方法,只能繼承(獲得)父構(gòu)造函數(shù)原型對象的屬性和方法
A · 利用對象的動態(tài)特性添加屬性
<script>
function A(){}
A.prototype.name = "默認的名稱";
var a1 = new A();
var a2 = new A();
console.log(a1.name);
console.log(a2.name);
</script>
B · 替換(字面量的方式)原型對象
<script>
function A(){}
A.prototype = {
name : "默認名稱",
constructor : A
}
var a1 = new A();
var a2 = new A();
console.log(a1.name);
console.log(a2.name);
</script>
C · B.prototype = A.prototype;
<script>
function A(){
this.name = "默認的名稱",
this.age = 30
}
function B(){}
A.prototype.des = "描述信息-A";
// 設(shè)置B的原型對象
B.prototype = A.prototype;
// 修正構(gòu)造器屬性
B.prototype.constructor = B;
var b1 = new B();
var b2 = new B();
console.log(b1.des);
console.log(b2.des);
console.log(b1.constructor); //function B(){}
console.log(b2.constructor); //function B(){}
console.log(b1.name); //undefined
var a1 = new A();
console.log(a1.constructor); //function B(){}
console.log(a1.name);
</script>
B.prototype = A.prototype 內(nèi)存結(jié)構(gòu)圖
** B.prototype = A.prototype; 存在的問題:**
001 構(gòu)造器屬性指向(默認指向的是父構(gòu)造函數(shù))
002 無法獲得實例屬性和方法,只能繼承(獲得)父構(gòu)造函數(shù)原型對象的屬性和方法