DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> JavaScript入門知識 >> 關於JavaScript >> 詳解JS面向對象編程
詳解JS面向對象編程
編輯:關於JavaScript     

因為JavaScript是基於原型(prototype)的,沒有類的概念(ES6有了,這個暫且不談),我們能接觸到的都是對象,真正做到了一切皆為對象

所以我們再說對象就有些模糊了,很多同學會搞混類型的對象和對象本身這個概念,我們在接下來的術語中不提對象,我們使用和Java類似的方式,方便理解

方式一

類(函數模擬)

function Person(name,id){
 //實例變量可以被繼承
 this.name = name;
 //私有變量無法被繼承
 var id = id;
 //私有函數無法被繼承
 function speak(){
  alert("person1");
 }
}
//靜態變量,無法被繼承
Person.age = 18;
//公有函數可以被繼承
Person.prototype.say = function(){
 alert("person2");
}

繼承,並調用父類方法

function Person(name,id){
 //實例變量可以被繼承
 this.name = name;
 //私有變量無法被繼承
 var id = id;
 //私有函數無法被繼承
 function speak(){
  alert("person1");
 }
}
//靜態變量,無法被繼承
Person.age = 18;
//公有靜態成員可被繼承
Person.prototype.sex = "男";
//公有靜態函數可以被繼承
Person.prototype.say = function(){
 alert("person2");
}
//創建子類
function Student(){
}
//繼承person
Student.prototype = new Person("iwen",1);
//修改因繼承導致的constructor變化
Student.prototype.constructor = Student;
var s = new Student();
alert(s.name);//iwen
alert(s instanceof Person);//true
s.say();//person2

繼承,復寫父類方法且實現super()

function Person(name,id){
 //實例變量可以被繼承
 this.name = name;
 //私有變量無法被繼承
 var id = id;
 //私有函數無法被繼承
 function speak(){
  alert("person1");
 }
}
//靜態變量,無法被繼承
Person.age = 18;
//公有靜態成員可被繼承
Person.prototype.sex = "男";
//公有靜態函數可以被繼承
Person.prototype.say = function(){
 alert("person2");
}
//創建子類
function Student(){
}
//繼承person
Student.prototype = new Person("iwen",1);
//修改因繼承導致的constructor變化
Student.prototype.constructor = Student;
//保存父類的引用
var superPerson = Student.prototype.say;
//復寫父類的方法
Student.prototype.say = function(){
 //調用父類的方法
 superPerson.call(this);
 alert("Student");
}
//創建實例測試
var s = new Student();
alert(s instanceof Person);//true
s.say();//person2 student

繼承的封裝函數

function extend(Child, Parent) {

    var F = function(){};
    F.prototype = Parent.prototype;
    Child.prototype = new F();
    Child.prototype.constructor = Child;
    Child.uber = Parent.prototype;
  }

uber意思是為子對象設一個uber屬性,這個屬性直接指向父對象的prototype屬性。(uber是一個德語詞,意思是”向上”、”上一層”。)這等於在子對象上打開一條通道,可以直接調用父對象的方法。這一行放在這裡,只是為了實現繼承的完備性,純屬備用性質。

方式二

相當於拷貝,通過定義的_this對象來承載想要被繼承的對象,這樣的話通過傳遞_this就可以實現繼承,比上面那種好理解些

//創建父類
function Person(name,id){
 //創建一個對象來承載父類所有公有東西
 //也就是說_this承載的對象才會被傳遞給子類
 var _this = {};
 _this.name = name;
 //這樣的是不會傳遞下去的
 this.id = id;
 //承載方法
 _this.say = function(){
  alert("Person");
 }
 //返回_this對象
 return _this;
}
//子類
function Student(){
 //獲取person的_this對象,從而模仿繼承
 var _this = Person("iwne",1);
 //保存父類的_this引用
 var superPerson = _this.say;
 //復寫父類的方法
 _this.say = function(){
  //執行父類的say
  superPerson.call(_this);
  alert("Student");
 }
 return _this;
}
var s = new Student();
s.say();

希望對大家學習javascript程序設計有所幫助。

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved