2012-04-14 35 views
6

Trước hết tôi xin lỗi nếu đây là một câu hỏi ngu ngốc. Tôi đã viết hai đoạn mã dưới đây. Đoạn mã đầu tiên được tìm thấy từ here được viết bởi John Resig và chắc chắn anh ấy là một trong những người bán và đoạn mã thứ hai được tôi sửa đổi từ mã gốc chỉ để hiểu sự khác biệt nhưng tôi không chắc chắn sự khác biệt giữa cả hai và những gì Tôi có thể và không thể làm với cả hai tương đối. Xin ai đó giúp tôi hiểu sự khác biệt. Cảm ơn.OOP javascript và Simple Class Instantiation

function makeClass(){ 
     return function(args){ 
      if (this instanceof arguments.callee) { 
       if (typeof this.init == "function") 
        this.init.apply(this, args.callee ? args : arguments); 
       } 
       else return new arguments.callee(arguments); 
     }; 
    } 
    var User = makeClass(); 
    User.prototype.init = function(first, last){ 
     this.name = first + " " + last; 
    }; 
    var user = User("John", "Resig"); 
    console.log(user); 

Modified phiên bản

function myClass(args) 
    { 
     if (this instanceof arguments.callee) 
     { 
      this.init = function(first, last){ 
       this.name = first + " " + last; 
      }; 
      this.init.apply(this, args.callee ? args : arguments); 
     } 
     else return new arguments.callee(arguments); 
    } 
    var obj = new myClass('Sheikh', 'Heera'); 
      console.log(obj); 

Tại sao tôi nên sử dụng nguyên mẫu của đối tượng để thêm một phương pháp (sau khi thực hiện một ví dụ) thay vì viết nó bên trong các nhà xây dựng?

Trả lời

7

Một lý do chính để xác định một phương thức trên nguyên mẫu của đối tượng chứ không phải ở các nhà xây dựng là các phương pháp quy định tại nguyên mẫu là có ngay lập tức đểchia sẻ bởi (trong bộ nhớ) tất cả các trường của đối tượng.

Bằng cách xác định phương thức trong hàm tạo, phương thức đó cụ thể cho cá thể của đối tượng tạo đối tượng đó. Nếu bạn nhúng 10 đối tượng của mình, bạn sẽ có 10 bản sao của phương thức trong bộ nhớ, mặc dù chúng giống nhau, cho đến khi bạn sửa đổi một trong số chúng.

Để rõ ràng, bởi được chia sẻ trong số các trường hợp đối tượng, tôi không có nghĩa là phương thức hoạt động tĩnh trên bất kỳ thuộc tính nào mà nó truy cập. Các thuộc tính đó (nếu được xác định với this.) vẫn là cá thể cụ thể. Nó chỉ là bạn không kết thúc việc xác định nhiều bản sao của cùng một phương pháp.