@昨晚和朋友聊了很久的編程思想;她跟我說:自己之前是一些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的屬性指向他的構造函數;
需要看詳情的朋友們可以點擊這個鏈接:點擊打開鏈接,也可以在下面留言評論交換看法。