js對象
來自專欄劉卿的技術思維
程序員的世界裡有一個梗就是你可以new 一個對象,不過在js的世界中對象到是什麼?
對象:
- 屬性的無序集合。
- 每一個屬性存放一個原始值、對象、函數。如果是函數,他被看做對象的方法,否則該特性被看做屬性。
- 對象都是由類定義的。
- 對象的實體(物理表示)其實不可以直接訪問。創建對象後在變數中存儲的都是對象的引用。
- 對象的廢棄其實是由GC來操作的。當沒有對象引用的時候,該對象在一定時間後被回收。可以通過把對象設置為null,來強制回收。
比較遺憾的是js的世界中木有類。ps:es6中已經有了!
面向對象的要求:
- 封裝
- 聚集
- 繼承
- 多態
實例化對象
對象是用關鍵字 new 後跟實例化的類的名字創建。所以來new一個女朋友吧。
function GirlFriend(){};var girlFriend = new GirlFriend();
作用域
既然說到作用域,其實就直觀的判斷出來,存在2個作用域,公共的和私有的。
//共有的var a = 1;(function(){ //屬於該匿名函數中的私有的 var b = 2;})();
prototype
把它看成創建對象所依賴的模板。
這裡不得不說另一個東西__proto__,對象有屬性__proto__,指向該對象的構造函數的原型對象,function除了有屬性__proto__,還有屬性prototype,prototype指向該方法的原型對象。
具體說說prototype和__proto__的區別:
- prototype 用來實現基於原型的繼承與屬性的共享
- __proto__構成原型鏈,同樣用於實現基於原型的繼承。舉個例子,當我們訪問obj這個對象中的x屬性時,如果在obj中找不到,那麼就會沿著__proto__依次查找。
__proto__的指向?
- 指向創建這個對象的函數的顯式原型。
prototype的指向?
- 以當前函數作為構造函數構造出來的對象的原型對象。
寫個demo來做下示例
function Person(name){ this.name = name;}Person.prototype.say = function(){ console.log(this.name);}var charles = new Person(charles);console.log(charles.__proto__ === Person.prototype);
推薦閱讀:
※奇舞周刊第 257 期:我從小程序學到了什麼
※Picasso:開啟大前端的未來
※前端每周清單第63期:Polymer 3.0,iOS爆出新漏洞,2018前端工具調查結果
※2.看完你就該會git了
※通過QQ音樂介面獲取數據
TAG:ECMAScript | 前端開發 |