無序屬性的集合,屬性能夠包含基本值、對象或者函數,簡單理解爲對象是若干屬性的集合;
咱們常說的面向對象(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
用代碼來表示: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)