摘要:類的屬性和屬性在上一篇面向?qū)ο缶幊讨形覀円呀?jīng)了解到一個實例化對象會有一個指向構(gòu)造函數(shù)的屬性。子類的屬性,表示構(gòu)造函數(shù)的繼承,總是指向父類。完成構(gòu)造函數(shù)繼承的實質(zhì)如下第二條對原型鏈完成方法的繼承,實質(zhì)如下另外還有還有三種特殊情況。
介紹
ECMAScript 6 在接下來的一段時間內(nèi)將成為 ECMAScript的一個標(biāo)準(zhǔn)。這個標(biāo)準(zhǔn)預(yù)計在今年的時候就會被簽署,不管在Github,還是在很多社區(qū),javascript愛好者已經(jīng)早已開始擁抱變化,享受ES6 帶來的美好,這篇文章將介紹ES6的一些新特性。由于ES6 還沒有很好地被瀏覽器支持,所以這篇文章的ES6代碼將使用 Babel 進行編譯。
ECMAScript 6 的新特性 箭頭(Arrow)=> 是function的簡寫形式,支持expression 和 statement 兩種形式。同時一點很重要的是它擁有詞法作用域的this值,幫你很好的解決this的指向問題,這是一個很酷的方式,可以幫你減少一些代碼的編寫,先來看看它的語法。
([param] [, param]) => { statements } param => expression
然后再來看看例子,以及babel 編譯后的結(jié)果。
ES6:
babel編譯后結(jié)果:
類(class)ES6 引入了class(類),讓javascript的面向?qū)ο缶幊套兊酶尤菀浊逦腿菀桌斫?。類只是基于原型的面向?qū)ο竽J降恼Z法糖。
class Animal { // 構(gòu)造方法,實例化的時候?qū)徽{(diào)用,如果不指定,那么會有一個不帶參數(shù)的默認構(gòu)造函數(shù). constructor(name,color) { this.name = name; this.color = color; } // toString 是原型對象上的屬性 toString() { console.log("name:" + this.name + ",color:" + this.color); } } var animal = new Animal("dog","white"); animal.toString(); console.log(animal.hasOwnProperty("name")); //true console.log(animal.hasOwnProperty("toString")); // false console.log(animal.__proto__.hasOwnProperty("toString")); // true class Cat extends Animal { constructor(action) { // 子類必須要在constructor中指定super 方法,否則在新建實例的時候會報錯. // 如果沒有置頂consructor,默認帶super方法的constructor將會被添加、 super("cat","white"); this.action = action; } toString() { console.log(super.toString()); } } var cat = new Cat("catch") cat.toString(); // 實例cat 是 Cat 和 Animal 的實例,和Es5完全一致。 console.log(cat instanceof Cat); // true console.log(cat instanceof Animal); // true類的 prototype 屬性和 __proto__ 屬性
在上一篇 javascript面向?qū)ο缶幊?中我們已經(jīng)了解到一個實例化對象會有一個 __proto__ 指向構(gòu)造函數(shù)的 prototype 屬性。在 class 中。同時具有 __proto__ 和 prototype 兩個屬性,存在兩條繼承鏈。
子類的 __proto__ 屬性,表示構(gòu)造函數(shù)的繼承,總是指向父類。
子類的 prototype 的 __proto__ 屬性表示方法的繼承,總是指向父類的 prototype 屬性。
class Cat extends Animal {} console.log(Cat.__proto__ === Animal); // true console.log(Cat.prototype.__proto__ === Animal.prototype); // true
我們先來看第一條 Cat.__proto__ === Animal 這條原型鏈。完成構(gòu)造函數(shù)繼承的實質(zhì)如下:
class Cat extends Animal { construcotr() { return Animal.__proto__.call(this); } }
第二條對原型鏈 Cat.prototype.__proto__ === Animal.prototype 完成方法的繼承,實質(zhì)如下:
Cat.prototype.__proto__ = Animal.prototype
另外還有還有三種特殊情況。
class A extends Object {} console.log(A.__proto__ === Object); // true console.log(A.prototype.__proto__ === Object.prototype);
A繼承Object,A的__prototype__ 指向父類Object. A的 prototype.__proto__ 指向父類Object的prototype。
從上篇文章中的 函數(shù)對象的原型 中我們可以了解到,函數(shù)是一種特殊的對象,所有函數(shù)都是 Function 的實例。
class Cat {} console.log(Cat.__proto__ === Function.prototype); //true console.log(Cat.prototype.__proto__ === Object.prototype); //true
由于Cat不存在任何繼承,就相當(dāng)于一個普通函數(shù),由于函數(shù)都是Function 的實例,所以 Cat.__proto__指向 Function.prototype. 第二條繼承鏈指向父類(Function.prototype) 的prototype屬性,所以 Cat.prototype.__proto__ === Object.prototype. Cat調(diào)用后會返回Object實例,所以 A.prototype.__proto__ 指向構(gòu)造函數(shù)(Object)的prototype。
class Cat extends null {}; console.log(Cat.__proto__ === Function.prototype); // true; console.log(Cat.prototype.__proto__ === null); //true
Cat是一個普通函數(shù),所以繼承 Function.prototype .第二條繼承鏈不繼承任何方法,所以 Cat.prototype.__proto__ == null.
Module到目前為止,javascript (ES5及以前) 還不能支持原生的模塊化,大多數(shù)的解決方案都是通過引用外部的庫來實現(xiàn)模塊化。比如 遵循CMD規(guī)范的 Seajs 和AMD的 RequireJS 。在ES6中,模塊將作為重要的組成部分被添加進來。模塊的功能主要由 export 和 import 組成.每一個模塊都有自己多帶帶的作用域,模塊之間的相互調(diào)用關(guān)系是通過 export 來規(guī)定模塊對外暴露的接口,通過import來引用其它模塊提供的接口。同時還為模塊創(chuàng)造了命名空間,防止函數(shù)的命名沖突。
export,import 命令//test.js export var name = "Rainbow"
ES6將一個文件視為一個模塊,上面的模塊通過 export 向外輸出了一個變量。一個模塊也可以同時往外面輸出多個變量。
//test.js var name = "Rainbow"; var age = "24"; export {name, age};
定義好模塊的輸出以后就可以在另外一個模塊通過import引用。
//index.js import {name, age} from "./test.js"整體輸入,module指令
//test.js export function getName() { return name; } export function getAge(){ return age; }
通過 import * as 就完成了模塊整體的導(dǎo)入。
import * as test form "./test.js";
通過指令 module 也可以達到整體的輸入。
module test from "test.js"; test.getName();export default
不用關(guān)系模塊輸出了什么,通過 export default 指令就能加載到默認模塊,不需要通過 花括號來指定輸出的模塊,一個模塊只能使用 export default 一次
// default 導(dǎo)出 export default function getAge() {} // 或者寫成 function getAge() {} export default getAge; // 導(dǎo)入的時候不需要花括號 import test from "./test.js";
一條import 語句可以同時導(dǎo)入默認方法和其它變量.
import defaultMethod, { otherMethod } from "xxx.js";
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/85751.html
摘要:學(xué)習(xí)筆記頂層對象雖然是筆記但是基本是抄了一次大師的文章了頂層對象頂層對象,在瀏覽器環(huán)境指的是對象,在指的是對象。之中,頂層對象的屬性與全局變量是等價的。的寫法模塊的寫法上面代碼將頂層對象放入變量。參考引用頂層對象實戰(zhàn) es6學(xué)習(xí)筆記-頂層對象_v1.0 (雖然是筆記,但是基本是抄了一次ruan大師的文章了) 頂層對象 頂層對象,在瀏覽器環(huán)境指的是window對象,在Node指的是gl...
摘要:本筆記為閱讀阮老師的文章自己的總結(jié),僅作自用,感謝阮老師的技術(shù)分享。字符串的遍歷器接口新增判斷字符串的包含情況返回值,表示是否找到了字符串。返回值表示參數(shù)字符串是否在原字符串的頭部。 本筆記為閱讀http://es6.ruanyifeng.com/ 阮老師的文章自己的總結(jié),僅作自用,感謝阮老師的技術(shù)分享。 1.超過uFFFF的字符ES5無法正確顯示,會顯示成前面的uFFFF的碼點符號加...
摘要:最近買了深入理解的書籍來看,為什么學(xué)習(xí)這么久還要買這本書呢主要是看到核心團隊成員及的創(chuàng)造者為本書做了序,作為一個粉絲,還是挺看好這本書能給我?guī)硪粋€新的升華,而且本書的作者也非常厲害。 使用ES6開發(fā)已經(jīng)有1年多了,以前看的是阮一峰老師的ES6教程,也看過MDN文檔的ES6語法介紹。 最近買了《深入理解ES6》的書籍來看,為什么學(xué)習(xí)ES6這么久還要買這本書呢?主要是看到Daniel A...
摘要:新搭建的個人博客,本文地址學(xué)習(xí)筆記用重寫在一開始的時候配置中我們就加入了的支持,就是下面的配置,但之前的學(xué)習(xí)筆記都使用的完成,所以專門作一篇筆記,記錄使用完成創(chuàng)建相關(guān)文件修改,增加該入口文件修改,引入該文件做個簡單的測試,看下瀏覽器全部用來 新搭建的個人博客,本文地址:React學(xué)習(xí)筆記3:用es2015(ES6)重寫CommentBox在一開始的時候webpack配置中我們就加入了e...
摘要:彩票項目實戰(zhàn)學(xué)習(xí)記錄一完整走了一遍課程,覺得還不錯。支持正版人人有責(zé)零基礎(chǔ)教學(xué)解析彩票項目下面是項目課程的目錄路線一個項目分為三部分業(yè)務(wù)邏輯,自動構(gòu)建系統(tǒng),模擬數(shù)據(jù)和真實數(shù)據(jù)接口處理。 彩票項目實戰(zhàn)學(xué)習(xí)記錄(一) 完整走了一遍課程,覺得還不錯。 總結(jié): es6的知識點說得還算清楚,主要是為了了解和使用,不是深究,所以淺嘗即止即可,所以覺得還不錯。 完整還原了項目開發(fā)的代碼設(shè)計和開發(fā)過...
閱讀 2764·2021-11-25 09:43
閱讀 2128·2021-11-18 13:25
閱讀 4619·2021-09-22 15:52
閱讀 1888·2021-09-22 15:49
閱讀 2231·2019-08-30 15:54
閱讀 3023·2019-08-29 17:13
閱讀 2329·2019-08-29 16:54
閱讀 2269·2019-08-29 12:58