2013-08-06 25 views
8

Tôi mới sử dụng các đối tượng trong javascript. Đọc về chủ đề này trên https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript và hơi bối rối.Định nghĩa đối tượng theo 2 cách - sự khác biệt là gì?

Tôi không hiểu sự khác biệt giữa các hàm và đối tượng. Một mặt, hàm được cho là và thể hiện hàm (là một đối tượng con) và do đó một hàm cũng được coi là một đối tượng.

Trên đối tượng Mặt khác bản thân được ký hiệu là một cặp khóa-giá trị, chẳng hạn như:

  1. var User = {name:"Tomy", password:"secret"}

    và điều này là hoàn toàn khác với một định nghĩa chức năng về tính tương thích mã ..

    Tôi có thể tạo hàm không bằng hai cách khác nhau không?

  2. var User = function() {this.name="Tomy"; this.password="secret";}

+2

Với B u có thể làm 'var tomy = new User();' – DarkBee

+2

Và đối tượng là một cấu trúc dữ liệu để giữ ... dữ liệu. Một hàm là một tập hợp các lệnh có thể tái sử dụng được. Bạn có thể sử dụng hàm như hàm * constructor * để * tạo * một đối tượng. Một đối tượng theo nghĩa đen và hàm dựng là hai cách để tạo các đối tượng, chỉ rằng bạn phải rõ ràng * gọi * hàm tạo hàm để tạo đối tượng. –

+0

@DarkBee Chính xác hơn, phiên bản B có một mẫu thử nghiệm (tập hợp các thuộc tính nhân bản trên mỗi cá thể mới) trong khi A thì không. EDIT: Làm cho tôi nghĩ rằng, bạn có thể sử dụng mới với A nếu bạn thêm một tài sản nguyên mẫu cho các đối tượng vô danh? – Virus721

Trả lời

7

Trong ví dụ này, User hiện giữ một đối tượng.

var User = {name:"Tomy", password:"secret"} 
typeof User === "object" 
User.name === "Tomy" 

Trong ví dụ này, User sẽ giữ chức năng. Chức năng này có thể được sử dụng để tạo các đối tượng.

var User = function() {this.name="Tomy"; this.password="secret";} 
typeof User === "function" 
User.name === undefined 

Sau đó, bạn có thể tạo bao nhiêu người dùng tùy thích.

var user1 = new User(), user2 = new User(); 
user1.name === "Tomy" 

Một ví dụ thực tế hơn, sẽ là:

var User = function (name, pass) {this.name=name; this.password=pass;} 

var john = new User("John", "secret") 
var andrew = new User("Andrew", "passw0rd") 

john.password === "secret" 

chung constructors (chức năng mà làm cho các đối tượng) là linh hoạt hơn literals đối tượng, và cho phép để tạo thuận tiện và phù hợp của các đối tượng (lỗi dễ phát hiện hơn, ít mã trùng lặp hơn).

Không có sự không thống nhất giữa các trình duyệt trong hai phương pháp.


Để hiểu được new keyword là gì và hiệu quả sẽ xảy ra tại "khoảnh khắc sáng tạo", xem What is the 'new' keyword in JavaScript?How does the new operator work in JavaScript?

+0

ok, một câu hỏi cuối cùng liên quan đến "thời điểm sáng tạo" của một đối tượng ;-). khi tôi làm var john = new User ("John", "secret") thì điều gì xảy ra chính xác? Tôi đoán là: 1) đối tượng mới được tạo. 2) điều này được gắn với đối tượng mới được tạo ra đó. 3) chức năng được gọi. (và do đó tạo ra các thành viên dữ liệu khi gọi this.something). Tôi đã làm đúng chứ? – Novellizator

+0

@Novellizator, tôi đã thêm một lời giải thích vào cuối câu trả lời của tôi. – FakeRainBrigand

+0

@FakeRainBrigand: Không, không có gì được sao chép. Và đối tượng mới không tương đương với '{}' (trừ khi 'User.prototype' là' null'). Vui lòng tham khảo https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new để biết các bước chính xác. – Bergi

2

Người đầu tiên tạo ra một thể hiện của một đối tượng với hai thuộc tính. Bạn có thể truy cập chúng như thế này:

User.name; // Tomy 
User.password; // secret 

Thứ hai tạo ra định nghĩa về một đối tượng mà bạn có thể tạo trường hợp riêng biệt và chúng sẽ có trường hợp riêng biệt. Ví dụ:

var a = new User(); 
a.name; // Tomy 
a.password; // secret 
var b = new User(); 
b.name = "Ralph"; 
a.name; // Tomy 
b.name; // Ralph 
1

Hai từ khóa không tương đương với từ xa. Phiên bản đầu tiên tạo một đối tượng, với các thuộc tính namepassword được đặt. Phiên bản thứ hai tạo ra một hàm chưa được thực hiện; không có thuộc tính nào được đặt cho đến khi new User được gọi.

Các vấn đề liên quan