看到同事用Dean Edwards寫的base.js來實現js的物件導向編程,因此在研究了一下。本文基本是代碼測試的例子,來簡單說明一下javascript物件導向編程的基本用法
/**
* @author gongpb
* 對一個對象添加執行個體方法和屬性-使用prototype關鍵字進行賦值-的格式:
* 對象名稱.prototype = {
* 屬性一 : 屬性值,
* 屬性二 : 屬性值,
* 方法一 : function(參數列表) {
* 方法體;
* },
* 方法二 : function(參數列表) {
* 方法體;
* }
* }
* 這樣通過new一個對象就可以通過執行個體名稱.屬性或方法來擷取屬性或執行方法了
*/
function HelloWorld()
{
alert('hello world!');
}
function test(){
var obj = new HelloWorld();
obj.sayHello(); //先hello world! 後js(一個是構造方法中的alert,一個是sayHello方法中的alert)
}
//給HelloWorld添加屬性name和方法sayHello
HelloWorld.prototype = {
name:"js",
sayHello:function(){
alert(this.name);
}
};
//test();
/**
* 如何給一個對象賦一個私人成員變數呢?
* 那我們就可能要改一下HelloWorld類的聲明方式了,
* 不使用prototype進行類的屬性和方法聲明,
* 而是直接使用內嵌函數和屬性進行聲明,修改的HelloWorld如下:
*
* 直接在函數內部進行了函數嵌套申明,
* 而且我們還設定了一個局部變數privateProp,即我們的私人成員變數,
* 該變數只能被HelloWorld2內部的函數進行訪問,外部存取是不允許的,
* 這樣我們就可以通過使用變數的範圍來巧妙的設定類的私人變數了
*/
function HelloWorld2(){
var privateProp = "hello word 2!";
this.myMethod = function(){
alert(privateProp);
};
}
function test2(){
var obj = new HelloWorld2();
alert(obj.myMethod()); //alert:hello word 2!
alert(obj.privateProp); //alert:undefined
}
//test2();
/**
* JS中如何為一個類定義靜態類方法和類屬性呢?
* 我們可以直接為類添加靜態屬性和靜態方法,
* 比如為HelloWorld類添加一個age的靜態屬性和一個hello的靜態方法,那麼聲明如下:
*/
function HelloWorld3(){
alert("hello world3");
}
//定義的靜態變數
HelloWorld3.age = 22;
//定義靜態方法
HelloWorld3.hello = function(){
alert(HelloWorld3.age);
};
HelloWorld3.prototype = {
sayHello:function(){
alert("sayHello");
}
};
function test3(){
var obj = new HelloWorld3(); //alert:hello world3
obj.sayHello(); // 正確,執行個體方法,可以通過執行個體進行訪問
//obj.hello(); //錯誤,不能通過執行個體訪問靜態方法。會報JS錯誤!
HelloWorld3.hello(); // 正確,靜態方法,通過類名進行直接存取
}
test3();
var pro = {
prop:"test",
myMethod:function(){
alert(this.prop);
}
};
pro.myMethod();
//實現javascript的繼承:
var A = function() {
};
A.prototype = {
sayHello: function() {
alert("sayHello A");
}
};
var B = function() {
};
B.prototype = A.prototype;
var b = new B();
b.sayHello();