javascript類繼承系列三(對象假裝)

原理:在子類的構造器上調用超類構造器(父類構造器中的this指向子類實例),js提供了apply()和call()函數,能夠實現這種調用數組

function baseClass() { this.colors = ['red', 'blue']; }
//在子類構造器調用父類構造器
function childClass() { baseClass.call(this); }
var instanse1 = new childClass();
var instanse2 = new childClass();
instanse2.colors.push('green');
var instanse3 = new childClass();
alert(instanse1.colors);//red,blue
alert(instanse2.colors);//red,blue,green
alert(instanse3.colors);//red,blue
//結果是:即便對某個繼承的實例進行修改,對其餘實例也沒影響,核心是子類構造器的 call()執行,與之相同功能的還有apply()
// 兩者做用:
// js每一個funciton都有call和apply方法,call函數的功能是在指定的對象上執行函數,它的第一個參數就是指定的對象,還能夠有多個參數,除第一個參數以外,其餘參數都是指定對象所需的參數
function fun(x, y) { this.pointX = x; this.pointY = y;}
var dot = {};
fun.call(dot, 10, 20);
alert(dot.pointX);
alert(dot.pointY);
其中fun.call(dot,10,20);使dot具備了fun的屬性,意思是在dot上運行fun(),在運行時,fun中的this指向dot,同時向fun()傳遞了兩個參數,
apply與call功能相同,可是調用形式不一樣app

//使用apply調用
fun.apply(dot, [30, 40]);
alert(dot.pointX);
alert(dot.pointY);函數

fun()調用所需的參數以數組形式傳遞給形參了,再參數不肯定用apply最合適了
因此若是函數傳遞參數是固定的,用call或者apply均可以,若是不固定用apply()this

 

function fun2(x, y, z) {
x = x || 0;
y = y || 0;
z = z || 0;
var list = [];
list.push(x);
list.push(y);
list.push(z);
alert(list);
}
fun2(1, 2, 3);
function fun1() { fun2.apply(this, arguments); }
fun1(10);
fun1(10, 20);
fun1(10, 20, 30);prototype

-------------------------------------------------------對象

function BaseClass(n, g) {
this.Name = n;
this.Gender = g;
this.getName = function () { return this.Name;}
}
BaseClass.prototype.GetGender = function () { return this.Gender; }
function ChildClass(n, g, m) {
BaseClass.call(this, n, g);
this.age = m;
}
ChildClass.prototype.GetAge = function () { return this.age; }
var instanse1 = new ChildClass('a', 'M', 20);
alert(instanse1.getName());
alert(instanse1.GetAge());
alert(instanse1.GetGender());//報錯
//GetGender未被繼承,說明僅靠構造函數實現繼承不可靠,應該使用原型
//getName()是定義在構造函數裏面的,意味着每次建立父類對象或者子類對象,這個方法都就會被重複建立一遍,而這種重複工做,是咱們應該避免的,不少時候,咱們將屬性定義在構造器裏面,將方法定義在原型對象上,
由於每一個對象擁有不一樣的屬性,但擁有相同的方法,繼承

相關文章
相關標籤/搜索