天天看點

js實作oop面向對象

應用文章原文連結:

https://www.jianshu.com/p/f9792fdd9915

以下為整理後可運作成功的示例代碼,記錄一下

//-------------------------------oop示例代碼   開始

/*
    javascript規定,
    每一個構造函數都有一個prototype屬性,指向另一個對象。
    這個對象的所有屬性和方法,都會被構造函數的執行個體繼承。
    這意味着,我們可以把那些不變的屬性和方法,直接定義在prototype對象上。
    __proto__是原型鍊,指向執行個體化的函數原型。
 */

//人類
function Person(name,age){
    this.name = name;
    this.age = age;
}
Person.prototype.run = function(){
    console.log('跑路~')
};
Person.prototype.say = function(){
    console.log('說話~')
};
console.log("Person的方法"+Person.prototype);
let person=new Person("張三",17);
console.log("person:"+person);
//男人
function Man(name,sex,age){
    Person.call(this,name,age);
    this.sex = sex;
}
/*
    由于:
    Man.prototype = Person.prototype;
    Man.prototype.yyy = function(){
        console.log('嘤嘤嘤');
    }
    這樣的寫法,因為複雜對象的指派操作是引用而不是指派,
    是以會發現Person的prototype也改變了,不能這樣使用,
    【要在循環中進行指派,來實作繼承屬性】
 */
// for(var key in Person.prototype){
//     Man.prototype[key] = Person.prototype[key];
//     console.log(key)
// }
//Man.prototype.constructor=Person.prototype.constructor;//發現構造不能指派?==>需要用中介+call
//是以要用更優的解決方案:【中繼】來做準備工作
function Ready(){}//
Ready.prototype = Person.prototype;//引用
Man.prototype = new Ready();//new 傳回了一個新對象 __proto__指向被執行個體化的構造函數的prototype
Man.prototype.constructor = Man;
console.log(Man.prototype);

Man.prototype.yyy = function(){
    console.log('嘤嘤嘤');
}
//.propertype是對象的内部方法,不能用JSON.stringify()檢視其輸出結果,隻能debug看
console.log("Man的方法:"+Man.prototype);
console.log("被Man繼承後的Person的方法:"+Person.prototype);
//通過new 關鍵字建立對象的執行個體
var xm = new Man("小明","女",18);
xm.yyy();
console.log(xm);
console.log(xm.sex);
console.log(xm.name);

//-------------------------------oop示例代碼   結束

           
js實作oop面向對象