js中的面向對象語法和編程思想

@昨晚和朋友聊了很久的編程思想;她跟我說:自己之前是一些CSS和HTML爲主,對js涉獵的比較少,昨天老大突然讓他做個新項目,新項目是以Vue和ES6以及jQuery爲主打,老大讓他以面向對象的思想去編寫js代碼。說是使用原型鏈的方式編程;他當時一臉懵逼, 那我咋辦?

    那麼咱們下面就說說面向對象和原型鏈的問題。

一、面向對象

    ECMAScript有兩種的開發模式:1、函數化(過程式),2、面向對象(OOP).面向對象的語言有一個標誌,那即是類的概念,通過類可以創建任意多個具有相同方法和屬性的對象,然而,ECMAScript沒有類的概念,因此它的對象也和類語言中的對象有所不同。

      1、創建對象

var a = {

    name: "king",

    age: 18,

    run: function(){

    alert(this.name) ==>輸出name的值;

}

}

   但是缺點就是我如果需要很多這樣的對象的時候,就會產生很多的代碼;

    這樣我們在用工廠函數的方法去解決多代碼的問題:

function createObj(name,age){

    var  obj = new Object();

    obj.name = name,

    obj.age= age,

    obj.run = function(_){ 

    return obj.name + obj.age

}

    return run

}

在這裏你就可以一直調用他了:例如:

var  a = createObj("king",16);

var  b = createObj("sun",10);

b();a()

這樣好像是解決了代碼多的上面的問題,但是又有新問題了,他會創建很多重複的有可能別的函數不會用到的屬性;也會消耗內存的;

2、構造函數

    構造函數的規範:@名字的首字母必須大寫@必須使用new

    function Body (name , age ) { 

    this.name = name;

    this.age = age;

    this.run = function ( ){

    return this.name +this.age


}

    var abody = new Body( "jry",23);

    var bbody = new Body( "love",23);

abody.run();               bbody.run();

這裏內存消耗的問題還是沒有解決,而且有了新問題,當把它作爲對象調用的時候this指向Body本身,而作爲普通的函數調用的時候,this指向全局的Windows;即是this指向的問題

    3、原型

我們在創建函數的時候都知道每一個函數都有一個prototype的原型屬性,他的用途就是把一些公用的屬性和方法放到原型對象上,下面我們看看代碼你就明白了;

    首先我們假設大家都會公用的方法是run,name,age;那麼

function Body (){ }

Body . prototype . name = "Wang";

Body . prototype . age = 20;

Body . prototype . run = function(){

    return  this.name + this.age+ .....

};

然後我們new出新的對象實例就可以直接使用在原型對象上公用的方法了,可以在自己的新對象中定義自己需要的方法什麼的了

var peso = function (name){

    this.name = name;

}

pose.prototype.getName = function(){

    return this.name;

}

var sss= new peso ('wangdachui');

sss.getName();

二、原型鏈(感謝博客園的@pompeybrain,這裏直接使用你的例子)

 1 function Person(name){
 2     this.name = name;
 3     var label = 'Person';
 4 }
 5 
 6 Person.prototype.nickName = 'PersonPrototype';
 7 
 8 Person.prototype.greet = function(){
 9     console.log('Hi! I am ' + this.name);
10 }
11 
12 function Student(name,school){
13     this.name = name;
14     this.school = school;
15     var label = 'Student';
16 }
17 
18 Student.prototype.__proto__ = Person.prototype;19 
20 var p1 = new Person('p1');
21 var s1 = new Student('s1','USTB');
22 p1.greet();//Hi! I am p1
23 s1.greet();//Hi! I am s1

我們把它轉換成一張圖看看


這個圖就完美的解釋了原型鏈以及每個對象都有一個_proto_屬性,也就是任何一個對象都可以是某一個對象的原型;而每一個原型對象都有一個constructor的屬性指向他的構造函數;

需要看詳情的朋友們可以點擊這個鏈接:點擊打開鏈接,也可以在下面留言評論交換看法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章