物件定義為:無序屬性的集合,其屬性可以包含基本值、物件或者函式
物件是由屬性和方法組成的:是乙個無序鍵值對的集合,指的是乙個具體的事物
let obj = new object()
obj.name = 'jack'
obj.getname = function ()
通過 new 建立的物件,都會在記憶體的堆空間中開啟新的空間
每次建立通過 new object() 比較麻煩,所以物件字面量提供一種簡單、優雅的方式建立物件。
let obj =
}obj.getname() //'jack';
// 這裡的name getname 都是物件的自有屬性
該方法接受乙個物件作為引數,然後以它為模板、為原型,生成返回乙個例項物件。該例項完全繼承原型物件的屬性。
object.create()方法生成的新物件,動態繼承了原型。在原型上新增或修改任何方法,會立刻反映在新物件之上。
// 建立乙個原型為null的空物件
o = object.create(null);
o = {};
// 以字面量方式建立的空物件就相當於:
o = object.create(object.prototype);
// 修改物件原型obj1會影響到例項物件obj2
let obj1 =
};//建立obj2,以obj1為原型繼承了它的原型物件
let obj2 = object.create(obj1);
console.log(obj2.name); //修改前:jack
// 修改原型
obj1.name = '張三'
console.log(obj2.name); //修改後:張三
obj2.getname() // hi! jack.
提供一種使用工廠模式建立封裝物件的新方式。
在內部建立物件,給物件賦予屬性及方法再將物件返回,減少冗餘**,提高**的重複利用率
function createperson(name, age)
//返回這個物件
return o;
}let person1 = createperson("jack", 22,);
console.log(person1.name); //jack
person1.getname(); //hi! jack
建構函式就是初始化乙個例項物件,物件的prototype屬性是繼承乙個例項物件,在建立時繫結所有方法和屬性。
function person(name)
}let person = new person('jack');
console.log(person.name); //jack
person.getname() //hi! jack
缺點:每乙個例項物件生成的getname方法都是一樣的,如果例項物件很多,多占用一些記憶體,會造成極大的記憶體浪費。和工廠模式的區別:
要建立 person 的新例項,必須使用 new 操作符。以這種方式呼叫建構函式實際上會經歷以下 4個步驟
會在記憶體中建立乙個空物件
設定建構函式的this,讓this指向剛剛建立好的物件
執行建構函式中的**
返回物件
function _new(params)
// 模擬測試使用
function person(name)
person.prototype.getname = function () ;
var person = _new(person, 'jack');
console.log(person); //
person.getname(); //hi! jack
person.__proto__ === person.prototype; // true
每乙個建構函式都有乙個prototype 屬性,指向另乙個物件。注意這個prototype 就是乙個物件,這個物件的所有屬性和方法,都會被建構函式所擁有。我們可以把那些不變的方法,直接定義在prototype 物件上,這樣所有物件的例項就可以共享這些方法
function person(name)
console.dir(person.prototype)
//那麼就可以為person的原型物件增加方法,這樣用person建構函式建立出來的例項都可以訪問新增加的方法
person.prototype.getname = function()
var p1 = new person('jack')
var p2 = new person('jackson')
p1.getname() //hi! jack
p2.getname() //hi! jack
通過原型物件可以解決建構函式中浪費記憶體的優點物件本身有 __proto__ 屬性指向建構函式的prototype原型物件,當呼叫物件的屬性或方法時,先去找物件本身的屬性/方法;找不到的話 再去調原型中的屬性/方法,物件的__proto__ 屬性 等於 建構函式的prototype,物件可以訪問原型物件所有成員
物件原型( _proto_)和建構函式(prototype)原型物件裡面都有乙個屬性 constructor 屬性 ,constructor 我們稱為建構函式,因為它指回建構函式本身。
constructor 主要用於記錄該物件引用於哪個建構函式,它可以讓原型物件重新指向原來的建構函式
function person(name)
// 很多情況下,我們需要手動的利用constructor 這個屬性指回 原來的建構函式
person.prototype = ,
}var p1 = new person('jack');
console.log(p1);
注意:如果我們修改了原來的原型物件,給原型物件賦值的是乙個物件,則必須手動的利用contructor指回原來的建構函式
任何物件都有原型物件,也就是prototype屬性,任何原型物件也是乙個物件,該物件就有proto屬性,這樣一層一層往上找,就形成了一條鏈,我們稱此為原型鏈;
1、 在建構函式中,裡面的this指向的是物件例項
2、 原型物件函式裡面的this指向的是例項物件
function person(name, age)
var that;
person.prototype.sing = function ()
var p1 = new person('jack');
// 1. 在建構函式中,裡面this指向的是物件例項 p1
console.log(that === p1); //true
將我自己的call方法新增到function建構函式的原型中
function.prototype.mycall = function (context)
// 執行函式
var result = context.fn(argsarr)
// 執行完把fn從原有的物件上刪除了, 保持obj的原有屬性
delete context.fn
return result
}//測試
var obj =
function fn(***)
fn.mycall(obj, '男')
js物件高階
使用建構函式來建立物件,建構函式相當於乙個模板。模板就是所有建立的物件的型別。instanceof 判斷某個物件是否屬於某個型別。js特性 基本資料型別可以訪問與之對應的物件型別的屬性和行為,在訪問時,自動將基本資料類 型轉換為物件型別。string string number number boo...
JS建立物件 高階
雖然用object建構函式或物件字面量可以建立單個物件,但有乙個明顯的缺點 使用同乙個介面建立物件,會產生大量重複的 為此紅寶書中又有三種基本的建立物件的方式 工廠模式 function createperson name,age,job return o var person1 createper...
js物件導向高階
function student name,age var stu1 new student 張三 18 像這樣需要通過new來使用的函式都可以稱為建構函式 通過this寫進去的,是它的例項方法,可以通過new來呼叫 student.nation china 向這樣直接新增進去的是靜態成員,只能通過...