Từ khóa 'mới' trong JavaScript là gì?


1744

Các newtừ khóa trong JavaScript có thể khá khó hiểu khi nó bắt gặp đầu tiên, khi mọi người có xu hướng nghĩ rằng JavaScript không phải là một ngôn ngữ lập trình hướng đối tượng.

  • Nó là gì?
  • Nó giải quyết vấn đề gì?
  • Khi nào thì thích hợp và khi nào thì không?

10
Ngoài ra, chủ đề liên quan - stackoverflow.com/questions/383402/
Kiếm

đọc những ví dụ đầu tiên folks, developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
Kẻ

Câu trả lời:


2145

Nó làm 5 việc:

  1. Nó tạo ra một đối tượng mới. Loại đối tượng này chỉ đơn giản là đối tượng .
  2. Nó đặt thuộc tính bên trong, không thể truy cập, [[nguyên mẫu]] (tức là __proto__ ) của đối tượng mới này thành đối tượng nguyên mẫu bên ngoài, có thể truy cập, của hàm tạo (mọi đối tượng hàm tự động có thuộc tính nguyên mẫu ).
  3. Nó làm cho thisđiểm biến đến đối tượng mới được tạo.
  4. Nó thực thi hàm constructor, sử dụng đối tượng vừa tạo bất cứ khi nào thisđược đề cập.
  5. Nó trả về đối tượng vừa tạo, trừ khi hàm constructor trả về nulltham chiếu không đối tượng. Trong trường hợp này, tham chiếu đối tượng đó được trả về thay thế.

Lưu ý: hàm constructor đề cập đến hàm sau newtừ khóa, như trong

new ConstructorFunction(arg1, arg2)

Khi điều này được thực hiện, nếu một thuộc tính không xác định của đối tượng mới được yêu cầu, tập lệnh sẽ kiểm tra đối tượng [[nguyên mẫu]] của đối tượng cho thuộc tính thay thế. Đây là cách bạn có thể nhận được một cái gì đó tương tự như kế thừa lớp truyền thống trong JavaScript.

Phần khó nhất về điều này là điểm số 2. Mọi đối tượng (bao gồm các hàm) đều có thuộc tính bên trong này được gọi là [[nguyên mẫu]] . Nó chỉ có thể được đặt tại thời điểm tạo đối tượng, với new , với Object.create hoặc dựa trên chữ (các hàm mặc định là Function.prototype, các số thành Number.prototype, v.v.). Nó chỉ có thể được đọc với Object.getPrototypeOf (someObject) . Không cách nào khác để đặt hoặc đọc giá trị này.

Các hàm, ngoài thuộc tính [[nguyên mẫu]] , còn có một thuộc tính được gọi là nguyên mẫu và đó là thứ mà bạn có thể truy cập và sửa đổi, để cung cấp các thuộc tính và phương thức được kế thừa cho các đối tượng bạn tạo.


Đây là một ví dụ:

ObjMaker = function() {this.a = 'first';};
// ObjMaker is just a function, there's nothing special about it that makes 
// it a constructor.

ObjMaker.prototype.b = 'second';
// like all functions, ObjMaker has an accessible prototype property that 
// we can alter. I just added a property called 'b' to it. Like 
// all objects, ObjMaker also has an inaccessible [[prototype]] property
// that we can't do anything with

obj1 = new ObjMaker();
// 3 things just happened.
// A new, empty object was created called obj1.  At first obj1 was the same
// as {}. The [[prototype]] property of obj1 was then set to the current
// object value of the ObjMaker.prototype (if ObjMaker.prototype is later
// assigned a new object value, obj1's [[prototype]] will not change, but you
// can alter the properties of ObjMaker.prototype to add to both the
// prototype and [[prototype]]). The ObjMaker function was executed, with
// obj1 in place of this... so obj1.a was set to 'first'.

obj1.a;
// returns 'first'
obj1.b;
// obj1 doesn't have a property called 'b', so JavaScript checks 
// its [[prototype]]. Its [[prototype]] is the same as ObjMaker.prototype
// ObjMaker.prototype has a property called 'b' with value 'second'
// returns 'second'

Nó giống như kế thừa lớp bởi vì bây giờ, bất kỳ đối tượng nào bạn thực hiện new ObjMaker()cũng sẽ xuất hiện để kế thừa thuộc tính 'b'.

Nếu bạn muốn một cái gì đó giống như một lớp con, thì bạn làm điều này:

SubObjMaker = function () {};
SubObjMaker.prototype = new ObjMaker(); // note: this pattern is deprecated!
// Because we used 'new', the [[prototype]] property of SubObjMaker.prototype
// is now set to the object value of ObjMaker.prototype.
// The modern way to do this is with Object.create(), which was added in ECMAScript 5:
// SubObjMaker.prototype = Object.create(ObjMaker.prototype);

SubObjMaker.prototype.c = 'third';  
obj2 = new SubObjMaker();
// [[prototype]] property of obj2 is now set to SubObjMaker.prototype
// Remember that the [[prototype]] property of SubObjMaker.prototype
// is ObjMaker.prototype. So now obj2 has a prototype chain!
// obj2 ---> SubObjMaker.prototype ---> ObjMaker.prototype

obj2.c;
// returns 'third', from SubObjMaker.prototype

obj2.b;
// returns 'second', from ObjMaker.prototype

obj2.a;
// returns 'first', from SubObjMaker.prototype, because SubObjMaker.prototype 
// was created with the ObjMaker function, which assigned a for us

Tôi đã đọc rất nhiều rác về chủ đề này trước khi cuối cùng tìm thấy trang này , nơi điều này được giải thích rất tốt với các sơ đồ đẹp.


47
Chỉ muốn thêm: Trên thực tế, có một cách để truy cập vào [[nguyên mẫu]], bởi __proto__. Tuy nhiên, điều này không chuẩn và chỉ được hỗ trợ bởi các trình duyệt tương đối mới (và không phải tất cả chúng). Có một cách được chuẩn hóa sắp tới, cụ thể là Object.getPrototypeOf (obj), nhưng đó là Ecmascript3.1, và bản thân nó chỉ được hỗ trợ trên các trình duyệt mới - một lần nữa. Nói chung, không nên sử dụng tài sản đó mặc dù, công cụ trở nên phức tạp thực sự nhanh chóng bên trong đó.
Blub

9
Câu hỏi: điều gì xảy ra khác nhau nếu ObjMakerđược định nghĩa là hàm trả về giá trị?
Jim Blackler

13
@LonelyPixel newtồn tại để bạn không phải viết các phương thức xuất xưởng để xây dựng / sao chép các hàm / đối tượng. Nó có nghĩa là, "Sao chép cái này, làm cho nó giống như 'lớp' của cha mẹ nó, làm như vậy một cách hiệu quả và chính xác và lưu trữ thông tin thừa kế chỉ có thể truy cập được đối với tôi, JS, trong nội bộ". Để làm như vậy, nó sửa đổi nội bộ không thể truy cập khác prototypecủa đối tượng mới để đóng gói hoàn toàn các thành viên được kế thừa, bắt chước các chuỗi thừa kế OO cổ điển (không thể sửa đổi thời gian chạy). Bạn có thể mô phỏng điều này mà không có new, nhưng kế thừa sẽ có thể sửa đổi thời gian chạy. Tốt chứ Xấu? Tùy bạn
Kỹ sư

11
một điểm nhỏ để thêm: một cuộc gọi đến một nhà xây dựng, khi đi trước từ khóa mới, sẽ tự động trả về đối tượng đã tạo; không cần phải trả lại nó một cách rõ ràng từ bên trong hàm tạo.
charlie rầm rộ

7
Có một lưu ý rằng Notice that this pattern is deprecated!. Mẫu cập nhật chính xác để đặt nguyên mẫu của một lớp là gì?
Tom Pažourek

400

Giả sử bạn có chức năng này:

var Foo = function(){
  this.A = 1;
  this.B = 2;
};

Nếu bạn gọi đây là một chức năng độc lập như vậy:

Foo();

Thực hiện chức năng này sẽ thêm hai thuộc tính cho windowđối tượng ( AB). Nó thêm nó vào windowbởi vì windowlà đối tượng được gọi là hàm khi bạn thực thi nó như thế và thistrong một hàm là đối tượng được gọi là hàm. Trong Javascript ít nhất.

Bây giờ, gọi nó như thế này với new:

var bar = new Foo();

Điều gì xảy ra khi bạn thêm newvào một lệnh gọi hàm là một đối tượng mới được tạo (chỉ var bar = new Object()) và thisbên trong hàm trỏ đến đối tượng mới Objectbạn vừa tạo, thay vì đối tượng được gọi là hàm. Vì vậy, barbây giờ là một đối tượng với các thuộc tính AB. Bất kỳ chức năng nào cũng có thể là một hàm tạo, nó không phải lúc nào cũng có ý nghĩa.


7
Phụ thuộc vào bối cảnh thực hiện. Trong trường hợp của tôi (kịch bản Qt) nó chỉ là một đối tượng toàn cầu.
Maxym

2
Điều này sẽ gây ra việc sử dụng bộ nhớ nhiều hơn?
Jürgen Paul

2
bởi vì window là đối tượng được gọi là hàm - phải là: bởi vì window là đối tượng chứa hàm.
Dávid Horváth

1
@Taurus Trong trình duyệt web, hàm không phải là phương thức sẽ là một phương thức windowngầm. Ngay cả trong một đóng cửa, ngay cả khi ẩn danh. Tuy nhiên, trong ví dụ này là một lời gọi phương thức đơn giản trên cửa sổ: Foo();=> [default context].Foo();=> window.Foo();. Trong biểu thức windownày là bối cảnh (không chỉ người gọi , không quan trọng).
Dávid Horváth

1
@Taurus Cơ bản là có. Tuy nhiên, trong ECMA 6 và 7 mọi thứ phức tạp hơn (xem lambdas, các lớp, v.v.).
Dávid Horváth

164

Ngoài câu trả lời của Daniel Howard, đây là những gì new(hoặc ít nhất là dường như làm):

function New(func) {
    var res = {};
    if (func.prototype !== null) {
        res.__proto__ = func.prototype;
    }
    var ret = func.apply(res, Array.prototype.slice.call(arguments, 1));
    if ((typeof ret === "object" || typeof ret === "function") && ret !== null) {
        return ret;
    }
    return res;
}

Trong khi

var obj = New(A, 1, 2);

tương đương với

var obj = new A(1, 2);

73
Tôi thấy rằng javascript dễ hiểu hơn tiếng Anh: v
damphat

Câu trả lời tuyệt vời. Tôi có một câu hỏi nhỏ: Làm sao có thể như vậy func.prototypeđược null? Bạn có thể vui lòng giải thích một chút về điều đó?
Tom Pažourek

6
@tomp bạn có thể ghi đè lên các thuộc tính prototype, bằng cách đơn giản bằng văn bản A.prototype = null;Trong trường hợp đó new A()sẽ cho kết quả trên đối tượng, đó là điểm mẫu nội bộ để các Objectđối tượng: jsfiddle.net/Mk42Z
basilikum

2
Việc kiểm tra typeof có thể sai vì một đối tượng máy chủ có thể tạo ra một cái gì đó khác với "đối tượng" hoặc "hàm". Để kiểm tra nếu một cái gì đó là một đối tượng, tôi thích Object(ret) === ret.
Oriol

2
@Oriol cảm ơn bạn đã bình luận. Đó là sự thật những gì bạn nói và bất kỳ thử nghiệm thực tế nên được thực hiện theo cách mạnh mẽ hơn. Tuy nhiên, tôi nghĩ đối với câu trả lời khái niệm này, typeofbài kiểm tra chỉ giúp dễ hiểu hơn những gì đang diễn ra đằng sau hậu trường.
basilikum

109

Để người mới bắt đầu hiểu nó tốt hơn

hãy thử đoạn mã sau trong bảng điều khiển trình duyệt.

function Foo() { 
    return this; 
}

var a = Foo();       //returns window object
var b = new Foo();   //returns empty object of foo

a instanceof Window;  // true
a instanceof Foo;     // false

b instanceof Window;  // false
b instanceof Foo;     // true

Bây giờ bạn có thể đọc câu trả lời wiki cộng đồng :)


4
Câu trả lời tốt. Ngoài ra - bỏ đi return this;mang lại sản lượng tương tự.
Nelu

37

Vì vậy, nó có thể không phải để tạo ra các đối tượng

Nó được sử dụng chính xác cho điều đó. Bạn định nghĩa một hàm tạo như vậy:

function Person(name) {
    this.name = name;
}

var john = new Person('John');

Tuy nhiên, lợi ích bổ sung mà ECMAScript có là bạn có thể gia hạn với .prototypetài sản, vì vậy chúng tôi có thể làm một cái gì đó như ...

Person.prototype.getName = function() { return this.name; }

Tất cả các đối tượng được tạo từ hàm tạo này bây giờ sẽ có một getNamechuỗi nguyên mẫu mà chúng có quyền truy cập.


6
hàm xây dựng hàm được sử dụng như các lớp, không có classtừ khóa nhưng bạn có thể làm khá nhiều thứ tương tự.
meder omuraliev

Có một loại từ khóa lớp - lớp được dành riêng để sử dụng trong tương lai
Greg

11
Ngẫu nhiên đó là lý do tại sao bạn sử dụng. ClassName không. Class để đặt lớp CSS
Greg

23
Nó nên được viết hoa Người theo quy ước.
eomeoff

27

JavaScript ngôn ngữ lập trình hướng đối tượng và được sử dụng chính xác để tạo các thể hiện. Nó dựa trên nguyên mẫu, thay vì dựa trên lớp, nhưng điều đó không có nghĩa là nó không hướng đối tượng.


6
Tôi muốn nói rằng JavaScript dường như thậm chí còn hướng đối tượng hơn tất cả các ngôn ngữ dựa trên lớp. Trong JavaScript, mọi thứ bạn viết ngay lập tức trở thành một đối tượng, nhưng trong các ngôn ngữ dựa trên lớp, trước tiên bạn viết khai báo và chỉ sau đó bạn mới tạo các thể hiện (đối tượng) cụ thể của các lớp. Và nguyên mẫu JavaScript dường như mơ hồ nhắc nhở tất cả những thứ VTABLE cho các ngôn ngữ dựa trên lớp.
JustAMartin

14

Javascript là một ngôn ngữ lập trình động hỗ trợ mô hình lập trình hướng đối tượng và nó được sử dụng để tạo các phiên bản mới của đối tượng.

Các lớp không cần thiết cho các đối tượng - Javascript là ngôn ngữ dựa trên nguyên mẫu .


12

Đã có một số câu trả lời rất hay nhưng tôi đang đăng một câu trả lời mới để nhấn mạnh quan sát của tôi về trường hợp III dưới đây về những gì xảy ra khi bạn có một tuyên bố trả lại rõ ràng trong một chức năng mà bạn đang thực newhiện. Hãy xem xét các trường hợp dưới đây:

Trường hợp I :

var Foo = function(){
  this.A = 1; 
  this.B = 2;
};
console.log(Foo()); //prints undefined
console.log(window.A); //prints 1

Trên đây là một trường hợp đơn giản gọi hàm ẩn danh được chỉ bởi Foo. Khi bạn gọi chức năng này, nó sẽ trả về undefined. Do không có câu lệnh trả về rõ ràng nên trình thông dịch JavaScript sẽ chèn mạnh một return undefined;câu lệnh vào cuối hàm. Ở đây, cửa sổ là đối tượng gọi (theo ngữ cảnh this) sẽ có các thuộc tính Avà mới B.

Trường hợp II :

var Foo = function(){
  this.A = 1;
  this.B = 2;
};
var bar = new Foo();
console.log(bar()); //illegal isn't pointing to a function but an object
console.log(bar.A); //prints 1

Ở đây, trình thông dịch JavaScript nhìn thấy newtừ khóa sẽ tạo ra một đối tượng mới đóng vai trò là đối tượng gọi (theo ngữ cảnh this) của hàm ẩn danh được chỉ bởi Foo. Trong trường hợp này ABtrở thành thuộc tính trên đối tượng mới được tạo (thay cho đối tượng cửa sổ). Vì bạn không có bất kỳ câu lệnh trả lại rõ ràng nào, nên trình thông dịch JavaScript sẽ chèn mạnh câu lệnh return để trả về đối tượng mới được tạo do sử dụng newtừ khóa.

Trường hợp III :

var Foo = function(){
  this.A = 1;
  this.B = 2;
  return {C:20,D:30}; 
};
var bar = new Foo();
console.log(bar.C);//prints 20
console.log(bar.A); //prints undefined. bar is not pointing to the object which got created due to new keyword.

Ở đây một lần nữa trình thông dịch JavaScript nhìn thấy newtừ khóa sẽ tạo ra một đối tượng mới đóng vai trò là đối tượng gọi (theo ngữ cảnh this) của hàm ẩn danh được chỉ bởi Foo. Một lần nữa, ABtrở thành thuộc tính trên đối tượng mới được tạo. Nhưng lần này bạn có một tuyên bố trả lại rõ ràng để trình thông dịch JavaScript sẽ không làm bất cứ điều gì của riêng nó.

Điều cần lưu ý trong trường hợp III là đối tượng được tạo do newtừ khóa bị mất khỏi radar của bạn. barthực sự đang trỏ đến một đối tượng hoàn toàn khác không phải là đối tượng mà trình thông dịch JavaScript đã tạo do newtừ khóa.

Trích dẫn David Flanagan từ JavaScripit: The Definitive Guide (Ấn bản thứ 6), Ch. 4, Trang # 62:

Khi một biểu thức tạo đối tượng được ước tính, trước tiên JavaScript sẽ tạo một đối tượng trống mới, giống như biểu thức được tạo bởi trình khởi tạo đối tượng {}. Tiếp theo, nó gọi hàm được chỉ định với các đối số đã chỉ định, chuyển đối tượng mới làm giá trị của từ khóa này. Sau đó, hàm có thể sử dụng điều này để khởi tạo các thuộc tính của đối tượng mới được tạo. Các hàm được viết để sử dụng như các hàm tạo không trả về một giá trị và giá trị của biểu thức tạo đối tượng là đối tượng mới được tạo và khởi tạo. Nếu một hàm tạo trả về một giá trị đối tượng, giá trị đó trở thành giá trị của biểu thức tạo đối tượng và đối tượng mới được tạo sẽ bị loại bỏ.

--- Thông tin bổ sung ---

Các hàm được sử dụng trong đoạn mã của các trường hợp trên có tên đặc biệt trong thế giới JS như sau:

Trường hợp I và II - Hàm xây dựng

Trường hợp III - Chức năng của nhà máy. Các chức năng của nhà máy không nên được sử dụng với newtừ khóa mà tôi đã thực hiện để giải thích khái niệm này trong luồng hiện tại.

Bạn có thể đọc về sự khác biệt giữa chúng trong chủ đề này .


trường hợp của bạn 3, là một quan sát gr8
appu

5

đôi khi mã dễ hơn từ:

var func1 = function (x) { this.x = x; }                    // used with 'new' only
var func2 = function (x) { var z={}; z.x = x; return z; }   // used both ways
func1.prototype.y = 11;
func2.prototype.y = 12;

A1 = new func1(1);      // has A1.x  AND  A1.y
A2 =     func1(1);      // undefined ('this' refers to 'window')
B1 = new func2(2);      // has B1.x  ONLY
B2 =     func2(2);      // has B2.x  ONLY

Đối với tôi, miễn là tôi không phải là nguyên mẫu, tôi sử dụng kiểu func2 vì nó giúp tôi linh hoạt hơn một chút trong và ngoài chức năng.


3
B1 = new func2(2); <- Tại sao điều này sẽ không có B1.y ?
sunny_dev

@sunny_dev Tôi không phải là chuyên gia về JS, nhưng có lẽ vì func2 đang trả lại trực tiếp một giá trị (đối tượng z), thay vì làm việc / trả về với các giá trị bên trong (này)
Eagle

5

Các new từ khóa thay đổi bối cảnh, theo đó các chức năng đã được chạy và trả về một con trỏ đến bối cảnh đó.

Khi bạn không sử dụng newtừ khóa, ngữ cảnh mà hàm Vehicle()chạy sẽ giống với ngữ cảnh mà bạn đang gọi Vehiclehàm. Các thistừ khóa sẽ đề cập đến cùng một bối cảnh. Khi bạn sử dụng new Vehicle(), một bối cảnh mới được tạo để từ khóa thisbên trong hàm đề cập đến bối cảnh mới. Những gì bạn nhận được là bối cảnh mới được tạo ra.


Đó là một câu trả lời sâu sắc về phạm vi. Gr8 thêm vào câu trả lời.
appu

3

Các newtừ khóa là để tạo các trường hợp đối tượng mới. Và vâng, javascript là một ngôn ngữ lập trình động, hỗ trợ mô hình lập trình hướng đối tượng. Quy ước về đặt tên đối tượng là, luôn luôn sử dụng chữ in hoa cho các đối tượng được cho là được khởi tạo bởi từ khóa mới.

obj = new Element();

2

Tóm lược:

Các newtừ khóa được sử dụng trong javascript để tạo ra một đối tượng từ một hàm constructor. Các newtừ khóa phải được đặt trước khi gọi hàm constructor và sẽ làm những điều sau đây:

  1. Tạo một đối tượng mới
  2. Đặt nguyên mẫu của đối tượng này thành thuộc tính nguyên mẫu của hàm tạo
  3. Liên kết thistừ khóa với đối tượng vừa tạo và thực thi hàm constructor
  4. Trả về đối tượng vừa tạo

Thí dụ:

function Dog (age) {
  this.age = age;
}

const doggie = new Dog(12);

console.log(doggie);
console.log(doggie.__proto__ === Dog.prototype) // true

Chính xác thì chuyện gì xảy ra:

  1. const doggie nói: Chúng ta cần bộ nhớ để khai báo một biến.
  2. Toán tử assigment =nói: Chúng ta sẽ khởi tạo biến này với biểu thức sau=
  3. Biểu thức là new Dog(12). Công cụ JS nhìn thấy từ khóa mới, tạo một đối tượng mới và đặt nguyên mẫu thành Dog.prototype
  4. Hàm constructor được thực thi với thisgiá trị được đặt thành đối tượng mới. Trong bước này là nơi tuổi được gán cho đối tượng chóe mới được tạo.
  5. Đối tượng mới được tạo được trả về và được gán cho biến chó.

1

Các newtừ khóa tạo ra trường hợp của các đối tượng sử dụng chức năng như một nhà xây dựng. Ví dụ:

var Foo = function() {};
Foo.prototype.bar = 'bar';

var foo = new Foo();
foo instanceof Foo; // true

Trường hợp kế thừa từ prototypehàm xây dựng. Vì vậy, đưa ra ví dụ trên ...

foo.bar; // 'bar'

2
Từ khóa mới về cơ bản liên kết chức năng như hàm tạo; bạn không cần phải trả lại bất cứ điều gì. Bạn chỉ có thể làm: hàm foo (x) {this.bar = x; } var obj = new foo (10); cảnh báo (obj.bar);
reko_t

Bạn không cần trả về các đối tượng từ hàm constructor trừ khi bạn đặc biệt muốn, cho một mục đích. Ví dụ: nếu bạn phải trả về một thể hiện đối tượng cụ thể thay vì tạo một đối tượng mới mỗi lần (vì bất kỳ lý do gì). Trong ví dụ của bạn, tuy nhiên, nó là hoàn toàn không cần thiết.
Chetan Sastry

Vâng, đó là một ví dụ. Bạn có thể trả lại một đối tượng. Có nhiều mẫu được sử dụng trong kịch bản này, tôi đã cung cấp một mẫu như là "ví dụ", do đó, từ của tôi "chẳng hạn".
mí mắt

1

Vâng JavaScript mỗi si có thể khác nhau rất nhiều từ nền tảng đến nền tảng vì nó luôn luôn là một triển khai của đặc tả EcmaScript ban đầu.

Trong mọi trường hợp, độc lập với việc triển khai tất cả các triển khai JavaScript tuân theo quyền đặc tả EcmaScript, sẽ cung cấp cho bạn Ngôn ngữ hướng đối tượng. Theo tiêu chuẩn ES:

ECMAScript là ngôn ngữ lập trình hướng đối tượng để thực hiện tính toán và thao tác với các đối tượng tính toán trong môi trường máy chủ.

Vì vậy, bây giờ chúng tôi đã đồng ý rằng JavaScript là một triển khai của EcmaScript và do đó nó là một ngôn ngữ hướng đối tượng. Định nghĩa củanew hoạt động trong bất kỳ ngôn ngữ hướng đối tượng nào, nói rằng từ khóa đó được sử dụng để tạo một thể hiện đối tượng từ một lớp của một loại nhất định (bao gồm các loại ẩn danh, trong các trường hợp như C #).

Trong EcmaScript, chúng tôi không sử dụng các lớp, vì bạn có thể đọc từ thông số kỹ thuật:

ECMAScript không sử dụng các lớp như C ++, Smalltalk hoặc Java. Thay vào đó, các đối tượng có thể được tạo theo nhiều cách khác nhau, bao gồm thông qua ký hiệu bằng chữ hoặc thông qua các hàm tạo tạo đối tượng và sau đó thực thi mã khởi tạo tất cả hoặc một phần của chúng bằng cách gán giá trị ban đầu cho các thuộc tính của chúng. Mỗi hàm tạo là một hàm có một thuộc tính có tên - nguyên mẫu được sử dụng để thực hiện các thuộc tính kế thừa và chia sẻ dựa trên nguyên mẫu. Các đối tượng được tạo bằng
cách sử dụng các hàm tạo trong các biểu thức mới; ví dụ: Ngày mới (2009,11) tạo đối tượng Ngày mới. Gọi một hàm tạo mà không sử dụng mới có các hậu quả phụ thuộc vào hàm tạo. Ví dụ: Date () tạo ra một chuỗi đại diện cho ngày và giờ hiện tại chứ không phải là một đối tượng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.