Js物件高階程式

2022-09-11 09:03:09 字數 3944 閱讀 1916

物件定義為:無序屬性的集合,其屬性可以包含基本值、物件或者函式

物件是由屬性和方法組成的:是乙個無序鍵值對的集合,指的是乙個具體的事物

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 向這樣直接新增進去的是靜態成員,只能通過...