Tôi đã sử dụng javascript một lúc, nhưng chưa bao giờ học ngôn ngữ qua các khái niệm cơ bản. Tôi đang đọc "Kỹ thuật Javascript Pro" của John Resig - Tôi đang đưa ra một số câu hỏi, nhưng tôi không tìm thấy câu trả lời cho họ trong sách hoặc trên google, v.v.Câu hỏi hướng đối tượng trong Javascript
John đưa ví dụ này vào sách của anh ấy :
Function # 1
function User(name, age){
this.name = name;
this.age = age;
}
// Add a new function to the object prototype
User.prototype.getName = function(){
return this.name;
};
User.prototype.getAge = function(){
return this.age;
};
var user = new User("Bob", 44);
console.log("User: " + user.getName() + ", Age: " + user.getAge());
tôi vẫn đang tìm hiểu về nguyên mẫu tài sản, vì vậy tôi cố gắng viết một cái gì đó tương tự:
Function # 2
function User (name, age) {
this.name = name;
this.age = age;
this.getName = function() {
return this.name;
};
this.getAge = function() {
return this.age;
};
}
var user = new User("Bob", 44);
console.log("User: " + user.getName() + ", Age: " + user.getAge());
Không sử dụng thuộc tính nguyên mẫu để tạo các hàm getName và getAge, nhưng đầu ra giống như ví dụ của John.
tôi mất nó thêm một bước nữa, và tạo này:
Function # 3
var User = {
name: "",
age: 0,
setName: function(name) {
this.name = name;
},
setAge: function(age) {
this.age = age;
},
getName: function() {
return this.name;
},
getAge: function() {
return this.age;
}
};
User.setName("Bob");
User.setAge(44);
console.log("User: " + User.getName() + ", Age: " + User.getAge());
Một lần nữa - có vẻ khác với ví dụ của John (và tôi đã phải thêm các phương pháp setter), nhưng sản lượng là giống nhau.
Câu hỏi # 1 - sự khác nhau giữa 3 chức năng là gì? Lợi thế của thuộc tính prototype là gì, và Function # 2 làm bất cứ điều gì không chính xác, vì nó có vẻ thẳng hơn về mã # 2 thay vì # 1 (mặc dù tôi chắc chắn # 1 đang làm tốt hơn khi thấy John tạo ra nó) .
Câu hỏi # 2 - Làm cách nào tôi có thể sửa đổi hàm # 3 để không sử dụng các phương thức setName và setAge, nhưng vẫn giữ ký hiệu {...}? Có thể {...} viết tắt có nhà thầu?
Cảm ơn bạn đã giúp tôi học!
EDIT Tôi nghĩ câu hỏi thứ 2 của tôi hơi khó hiểu. Tôi có nghĩa là làm thế nào tôi có thể sử dụng {...} các kí hiệu để tạo ra một đối tượng dùng, nhưng sau đó sau khi tôi tạo ra các đối tượng, nói điều gì đó như:
var user = new User("Bob", 44);
Cũng giống như trong Function # 1 - hoặc là không thể ?
EDIT # 2 Wow! Cảm ơn tất cả mọi người vì những câu trả lời tuyệt vời. Điều đó thực sự làm cho nó rõ ràng hơn rất nhiều với tôi. Vì vậy, nếu tôi hiểu chính xác, sự khác biệt giữa # 1 và # 2 không quá nhiều. Nếu tôi chỉ tạo ra một đối tượng "Người dùng" - chúng có thể không khác gì cả. Nhưng nếu chương trình của tôi tạo ra nhiều đối tượng User, thì # 1 rất có thể sẽ hiệu quả hơn và sử dụng ít bộ nhớ hơn vì tất cả các đối tượng sẽ chia sẻ cùng một chức năng.
Tôi thực sự đánh giá cao tất cả các câu trả lời tuyệt vời - Cảm ơn!
Tôi đoán tôi có nghĩa là câu hỏi # 2 là làm thế nào tôi có thể sửa đổi chức năng # 3 để tôi có thể nói điều gì đó như var person = new User(); – BrianH
Nhận xét này không hoàn toàn đúng 'Tất cả các hàm getName khác nhau đều hoạt động giống hệt nhau'. Loại # 2 có quyền truy cập vào các vars riêng – meouw
Quan điểm của tôi là chúng hoạt động giống nhau trong ví dụ. – Glomek