javascript 之對象-13

對象

無序屬性的集合,屬性能夠包含基本值、對象或者函數,簡單理解爲對象是若干屬性的集合;
咱們常說的面向對象(oop)編程實際上是指的一種編碼的思想,簡單理解爲用對象來封裝數據,利用封裝、繼承、多態對代碼進行復用、重構、以及解耦等;javascript

函數也是對象

每一個函數都是Function 的實例/對象,因此函數名是一個指向函數對象的指針,這個對象跟其餘對象同樣具備屬性,方法;java

 1  //函數聲明
 2     function sayName(){
 3 
 4     }
 5     //函數表達式
 6     var sayNmae=function(){
 7 
 8     }
 9     //Function 構造函數
10     var sayName=new Function()

Function 構造函數能夠接收任意數量參數做爲參數,可是最後一個參數始終是函數體,前面的參數則當作是函數的形參;編程

建立對象

一、字面量數組

   //字面量
    var p={name:'Joel',age:22}

二、構造函數函數

系統自帶:new Object(), Array(), Number(),Boolean(), Date()oop

var p=new Object();
    p.name='Joel';
    p.age='22';

自定義:爲了和普通函數區分,首字母大寫,用來構造對象的咱們稱爲構造函數this

  function Person(name){
        this.name=name;
        this.age=age;
    }
    var p=new Person('Joel',22);

New 操做符編碼

MDN上是這樣說的:
當代碼 new Foo (...) 執行時:spa

  • 一個新對象被建立,它繼承自 Foo .prototype。
  • 使用指定的參數調用構造函數 Foo,並將 this綁定到新建立的對象。 new Foo 等同於 new Foo (),只能用在 Foo 不傳遞任何參數的狀況。
  • 若是構造函數返回了一個「對象」,那麼這個對象會取代整個 new出來的結果。若是構造函數沒有返回對象,那麼 new出來的結果爲步驟1建立的對象。(通常狀況下構造函數不返回任何值,不過用戶若是想覆蓋這個返回值,能夠本身選擇返回一個普通對象來覆蓋。固然,返回數組也會覆蓋,由於數組也是對象。)

用代碼來表示:prototype

1 var o = new Object(); //建立對象
2 o.[[prototype]] = Foo.prototype;//建立的對象內部指針[[prototype]] 指向Foo的原型對象
3 Foo.call(o); //用建立的對象來綁定this 指針

因此,當咱們執行new Person('Joel',22)時,javascript會:

var o = new Object();
o.__proto__ = Person.prototype;
A.call(o);

將建立的o對象返回給p;即完成var p=new Person('Joel',22);

對象——若干屬性的集合

java或者C#中的對象都是new一個class,並且裏面有字段、屬性、方法,規定的很是嚴格。可是javascript就比較隨意了,數組是對象,函數是對象,對象仍是對象。對象裏面的一切都是屬性,只有屬性,沒有方法。那麼這樣方法如何表示呢?方法也是一種屬性。由於它的屬性表示爲鍵值對的形式。並且,javascript中的對象能夠任意的擴展屬性,沒有class的約束。

 1  var p={
 2         name:'Joel',
 3         age:22,
 4         sayName:function(){
 5             console.log(this.name);
 6         },
 7         run:function(){
 8             //TODO
 9         }
10     }
11     p.a=20;
12     console.log(p.a)
相關文章
相關標籤/搜索