接續(xù)上篇JavaScript基礎(chǔ)④基于原型的面向?qū)ο缶幊?/a>
前言
面向?qū)ο笳Z言的基本特征:封裝皮假,繼承怔接,多態(tài) 锐涯。 這是我們在學(xué)Java的時候犬辰,首先映入眼簾的一句話 嗦篱。封裝 - 顧名思義就是將一些東西(屬性,方法)藏起來 幌缝, 不讓外部調(diào)用的人知道 灸促, 防止出現(xiàn)使用不當(dāng) 。 繼承 - 萬事萬物皆為天地所化 涵卵, 同出一門而變化萬千 浴栽, 既有相同之處又有差異之所 。繼承就是將共有的特征特質(zhì)向下傳遞 轿偎, 父傳子典鸡,子傳孫 , 孫又傳孫 坏晦, 子子孫孫無窮盡也 萝玷。多態(tài) - 萬物終有始焉 , 而好事者歸為類 昆婿, 譬如:鳥類 球碉, 人類 , 然仓蛆,多態(tài)始于繼承 睁冬, 子繼承有父之功 , 而可完成父之功也 看疙。
在上篇文章中 豆拨, 我們大致了解了JavaScript基于引用的面向?qū)ο筇卣?, 但終歸寫起來比較麻煩 能庆, 在ES6標(biāo)準(zhǔn)中 施禾, 已經(jīng)可以使用class
作為類的關(guān)鍵字了 , 有了常規(guī)的面向的的寫法了 相味, 但內(nèi)部實現(xiàn)原理差不多 拾积, 只是添加了class
及一些面向?qū)ο蟮恼Z法糖 殉挽。使用的時候 , 需要考慮兼容性拓巧。
ES6面向?qū)ο?/h3>
ECMAScript是一種由Ecma國際通過ECMA-262標(biāo)準(zhǔn)化的腳本程序設(shè)計語言斯碌。這種語言在萬維網(wǎng)上應(yīng)用廣泛,它往往被稱為JavaScript或JScript肛度,但實際上后兩者是ECMA-262標(biāo)準(zhǔn)的實現(xiàn)和擴展傻唾。 -- 百度百科
基于原型的面向?qū)ο?/p>
// 基于原型 , 創(chuàng)建一個Person類
function Person() {
// 類的屬性
Person.prototype.name = "zeno";
Person.prototype.age = 20;
Person.prototype.job = "Software Engineer";
// 類的方法
Person.prototype.sayHello = function(){
alert("Hello "+this.name);
};
}
// 創(chuàng)建Person對象
var person = new Person();
alert(person.name); // out : zeno
person.sayHello(); // out : Hello zeno
基于原型的面向?qū)ο?承耿, 寫法上比較繁瑣 冠骄, 需要使用原型對象屬性 。
ES6 對象寫法
class Person {
constructor() {
var name ;
}
doSomthing() {
console.log('es6面向?qū)ο?);
}
}
var p = new Person();
p.doSomthing(); // out : es6面向?qū)ο?
ES6標(biāo)準(zhǔn)的面向?qū)ο笳Z法 加袋,比較像java的寫法 凛辣, 但又有些不同 , JavaScript中不能定義類屬性 职烧。
嘗試類屬性
class Person {
var name ;
} // out : es6.html:29 Uncaught SyntaxError: Unexpected identifier
在JavaScript中不支持這種寫法扁誓。
繼承 - extends
可以看出和Java的語法有點相像了 , 不過這種寫法好像很多語言都實現(xiàn)了 蚀之, 例如PHP
// 父類
class Person {
constructor() {
this.name = 'zeno';
}
doSomthing() {
console.log('es6面向?qū)ο?);
}
}
// 子類
class Human extends Person {
constructor() {
super();
this.job = 'software enginner' ;
}
}
var h = new Human();
console.log(h.name); // zeno
console.log(h.job); // software enginner
console.log(h.doSomthing()); // 會調(diào)用兩次 蝗敢,第一次es6面向?qū)ο?, 第二次undefined
調(diào)用console.log(h.doSomthing());
會調(diào)用兩次 足删, 初步估計是兩個類寿谴,各實例化了一次 , 每個對象調(diào)用一次doSomthing()
失受, 父類輸出 讶泰, 子類因沒有這個方法 , 而產(chǎn)生了undefined
贱纠。但我在子類實現(xiàn)了doSomthing()
方法 峻厚, 結(jié)果還是執(zhí)行了兩次 , 這讓我不明就里 谆焊, 暫且擱置 惠桃, 希望知道的有心人士解惑之 。
多態(tài)
JavaScript天生支持多態(tài) 辖试, 因為JavaScript是動態(tài)語言辜王,沒有類型的向上向下轉(zhuǎn)性 , 方便了很多 罐孝。
封裝
JavaScript在ES6中貌似支持封裝 呐馆, 但實驗了一下 , 并不可以 莲兢,沒有語法上的支持 汹来, 就目前來看 续膳, 這是JavaScript最弱的一部分了 。
不可行的封裝
class Dog {
constructor() {
this._name = 'lily';
this.age = 10 ;
}
getDogName() {
return this._name;
}
get Age() {
return this.age ;
}
}
var d = new Dog();
console.log(d._name); // out : lily 可以訪問到
JavaScript ES6中 收班, 默認(rèn)以下劃線開頭的屬性為私有屬性或方法 坟岔, 然而并沒有什么卵用 , 一樣可以訪問 摔桦。
結(jié)語
JavaScript在不斷的發(fā)展 社付, 尤其這幾年 , 發(fā)展尤其迅速 邻耕, 各種庫 鸥咖, 如雨后春筍般迸發(fā) , 并應(yīng)用于各個行業(yè)和領(lǐng)域 兄世,并一度向全棧發(fā)展 啼辣。