JacaScript 的 new 運算子介紹
new運算子的作用是新增一個物件範例。這個物件可以是用戶自定義的,也可以是帶建構式的一些系統自帶的物件。
語法
new constructor[([arguments])]
參數
建構式(constructor)
一個指明了物件類型的函式。
傳參(arguments)
一個用來被建構式呼叫的參數列表。
描述
新增一個用戶自定義的物件需要兩步:
定義建構式。
通過new來新增物件範例。
新增一個物件類型需要新增一個指定了名稱和屬性的函式;其中這些屬性可以指向它本身,也可以指向其他物件,看下面的例子:
當程式碼 new foo(...) 執行時:
一個新物件被新增。它繼承自foo.prototype.
建構式 foo 被執行。執行的時候,相應的傳參會被傳入,同時上下文(this)會被指定為這個新範例。new foo 等同於 new foo(), 只能用在不傳遞任何參數的情況。
如果建構式返回了一個「物件」,那麼這個物件會取代整個new出來的結果。如果建構式沒有返回物件,那麼new出來的結果為步驟1新增的物件,ps:一般情況下建構式不返回任何值,不過用戶如果想覆蓋這個返回值,可以自己選擇返回一個普通物件來覆蓋。當然,返回陣列也會覆蓋,因為陣列也是物件。
任何情況下都可以對任意一個物件增加新的屬性,比如 car1.color = "black" 這句程式碼給car1增加了一個新的屬性color , 然後給這個屬性賦值 "black"。然而,這個操作不會影響任何其他物件。如果想給所有同樣類型的物件增加屬性,你需要給Car這個物件類型來增加屬性。
你可以通過給 Function.prototype 增加屬性的方式來給所有先前定義的範例來增加屬性。這種定義屬性的方式會影響到所有通過new建構式新增的物件,因為它們共享了這個物件類型。下面的程式碼給範例car的物件類型增加了一個color屬性null,然後又給範例car1覆蓋了color屬性'black',詳見 prototype.
function Car() {}
car1 = new Car()
alert(car1.color) // undefined
Car.prototype.color = null
alert(car1.color) // null
car1.color = "black"
alert(car1.color) // black
例子
例1:物件類別型和物件範例
假設你要新增一個汽車的物件類型。你希望這個類型叫做car,這個類型具備make, model, year等屬性,要做到這些,你需要這樣來寫個建構式:
function car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
現在,你可以新增一個範例了:
var mycar = new car("Eagle", "Talon TSi", 1993);
這段程式碼新增了一個mycar這個物件範例,還給它賦予了3個屬性,現在mycar.make等於"Eagle", mycar.year 等於1993,以此類推。
你已經可以通過new來新增任意個汽車物件範例了:
var kenscar = new car("Nissan", "300ZX", 1992);
例2: 物件屬性為自身或其他物件
假設你定義了一個物件叫做person:
function person(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
然後定義了兩個範例:
var rand = new person("Rand McNally", 33, "M");
var ken = new person("Ken Jones", 39, "M");
然後你重寫了car的定義,增加了一個owner屬性來指向一個person物件範例:
function car(make, model, year, owner) {
this.make = make;
this.model = model;
this.year = year;
this.owner = owner;
}
新增範例變成了這樣:
var car1 = new car("Eagle", "Talon TSi", 1993, rand);
var car2 = new car("Nissan", "300ZX", 1992, ken);
上面的程式碼沒有傳字串或數字過去,而是傳了一個物件 rand 和 ken ,這個時候可以這樣來獲取car2的擁有者的名稱:
car2.owner.name
語法
new constructor[([arguments])]
參數
建構式(constructor)
一個指明了物件類型的函式。
傳參(arguments)
一個用來被建構式呼叫的參數列表。
描述
新增一個用戶自定義的物件需要兩步:
定義建構式。
通過new來新增物件範例。
新增一個物件類型需要新增一個指定了名稱和屬性的函式;其中這些屬性可以指向它本身,也可以指向其他物件,看下面的例子:
當程式碼 new foo(...) 執行時:
一個新物件被新增。它繼承自foo.prototype.
建構式 foo 被執行。執行的時候,相應的傳參會被傳入,同時上下文(this)會被指定為這個新範例。new foo 等同於 new foo(), 只能用在不傳遞任何參數的情況。
如果建構式返回了一個「物件」,那麼這個物件會取代整個new出來的結果。如果建構式沒有返回物件,那麼new出來的結果為步驟1新增的物件,ps:一般情況下建構式不返回任何值,不過用戶如果想覆蓋這個返回值,可以自己選擇返回一個普通物件來覆蓋。當然,返回陣列也會覆蓋,因為陣列也是物件。
任何情況下都可以對任意一個物件增加新的屬性,比如 car1.color = "black" 這句程式碼給car1增加了一個新的屬性color , 然後給這個屬性賦值 "black"。然而,這個操作不會影響任何其他物件。如果想給所有同樣類型的物件增加屬性,你需要給Car這個物件類型來增加屬性。
你可以通過給 Function.prototype 增加屬性的方式來給所有先前定義的範例來增加屬性。這種定義屬性的方式會影響到所有通過new建構式新增的物件,因為它們共享了這個物件類型。下面的程式碼給範例car的物件類型增加了一個color屬性null,然後又給範例car1覆蓋了color屬性'black',詳見 prototype.
function Car() {}
car1 = new Car()
alert(car1.color) // undefined
Car.prototype.color = null
alert(car1.color) // null
car1.color = "black"
alert(car1.color) // black
例子
例1:物件類別型和物件範例
假設你要新增一個汽車的物件類型。你希望這個類型叫做car,這個類型具備make, model, year等屬性,要做到這些,你需要這樣來寫個建構式:
function car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
現在,你可以新增一個範例了:
var mycar = new car("Eagle", "Talon TSi", 1993);
這段程式碼新增了一個mycar這個物件範例,還給它賦予了3個屬性,現在mycar.make等於"Eagle", mycar.year 等於1993,以此類推。
你已經可以通過new來新增任意個汽車物件範例了:
var kenscar = new car("Nissan", "300ZX", 1992);
例2: 物件屬性為自身或其他物件
假設你定義了一個物件叫做person:
function person(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
然後定義了兩個範例:
var rand = new person("Rand McNally", 33, "M");
var ken = new person("Ken Jones", 39, "M");
然後你重寫了car的定義,增加了一個owner屬性來指向一個person物件範例:
function car(make, model, year, owner) {
this.make = make;
this.model = model;
this.year = year;
this.owner = owner;
}
新增範例變成了這樣:
var car1 = new car("Eagle", "Talon TSi", 1993, rand);
var car2 = new car("Nissan", "300ZX", 1992, ken);
上面的程式碼沒有傳字串或數字過去,而是傳了一個物件 rand 和 ken ,這個時候可以這樣來獲取car2的擁有者的名稱:
car2.owner.name
留言
張貼留言