2014-05-25 22 views
11

Đây là đối tượng javascript của tôi, tôi muốn biết cách tránh sử dụng "điều này" nhiều lần trong nguyên mẫu. Tôi biết có rất nhiều lý thuyết và liên kết cho sự thừa kế nguyên mẫu và điều này có thể đã được trả lời rồi, nhưng khi tôi không thể làm cho tất cả các đầu gặp nhau, tôi nghĩ điều này có thể đáng giá một câu hỏi khác.Làm thế nào để tránh sử dụng "điều này" trong các nguyên mẫu Javascript

function shape(smth) { 
    this.a = smth 
    this.b = 2 
    this.c = 3 
} 

shape.prototype.doCalculus = function() { 
    return this.a * this.b + this.c - (2 * (this.b + this.c) + this.a); 
} 

module.exports = shape 
+0

Không có cách nào tiềm ẩn để đề cập đến thuộc tính của đối tượng bối cảnh. Điều tốt nhất bạn có thể làm là câu lệnh 'with', nhưng nó có đủ loại vấn đề và tốt nhất nên tránh. – Pointy

+5

Nếu bạn muốn các thành viên công cộng của một đối tượng, họ PHẢI được tham chiếu từ con trỏ 'this' này. Đó là cách OO hoạt động trong Javascript. Không có thay thế. Nếu bạn có rất nhiều tham chiếu đến cùng một biến trong một hàm, bạn có thể tạm thời đặt nó vào một biến cục bộ để lưu một số tham chiếu logic. – jfriend00

+0

@ jfriend00, tôi rất sẵn lòng chấp nhận câu trả lời này :) – user14742

Trả lời

6

Nếu bạn muốn thành viên công cộng của đối tượng, họ PHẢI được tham chiếu từ con trỏ this. Đó là cách OO hoạt động trong Javascript. Không có thay thế.

Nếu bạn có nhiều tham chiếu đến cùng một biến trong hàm, bạn có thể tạm thời đặt biến đó vào biến cục bộ để lưu một số tham chiếu logic (giống như với bất kỳ tham chiếu nhiều bước nào), nhưng bạn vẫn phải bước đầu truy xuất bằng cách sử dụng this.varName.


Có một chương trình có sử dụng biến thành viên "tin" trong một đóng cửa nhà xây dựng và không sử dụng nguyên mẫu có thể được sử dụng trong một số trường hợp và điều này cho phép bạn tham khảo các biến trực tiếp mà không cần sử dụng này this :

function shape(smth) { 
    var a = smth, 
     b = 2, 
     c = 3; 

    this.doCalculus = function() { 
     return a * b + c - (2 * (b + c) + a); 
    } 
} 

module.exports = shape 

Đối với loại đối tượng nơi bạn tạo nhiều trường hợp, điều này có thể tốn nhiều bộ nhớ hơn vì phương pháp không được lưu trữ trên nguyên mẫu dùng chung nhưng được tạo riêng cho từng trường hợp. Có những người cho rằng sự khác biệt trong tiêu thụ bộ nhớ là không quan trọng trong hầu hết các công dụng.

2

Bạn có thể tránh this như thế này:

function Shape(smth) { 
    return {"a": smth, "b": 2, "c": 3 }; 
} 

Nhưng một caveat tôi cần phải thêm là đối tượng quay trở lại dường như không chơi tốt với các phương pháp sử dụng thêm Shape.prototype.methodname

Vì vậy, như xa như tôi có thể làm việc ra, cho ví dụ ban đầu bạn sẽ cần phải làm:

function Shape(smth) { 
    return {"a": smth, 
      "b": 2, 
      "c": 3, 
      doCalculus: function() { 
       return this.a * this.b + this.c - (2 * (this.b + this.c) + this.a); 
      } 
    } 

vì vậy, bạn vẫn kết thúc với điều này (es), và bạn đã mất advantag es các phương pháp tách theo prototype. Tôi cũng đã cố gắng để có được jslint để vượt qua mã của tôi mà không đánh dấu vào hộp "Tolerate ... this", nhưng tôi đã đi đến kết luận nó tốt hơn nhiều để chỉ cần sử dụng this. Tất cả mọi người ngoại trừ Douglas Crockford dường như chấp nhận nó như là một phần không thể thiếu của javascript.

4

Có thể tránh sử dụng this trong các nhà xây dựng, bằng cách sử dụng Object.create để tạo ra các chuỗi nguyên mẫu, sau đó tuyên bố tài sản của bạn trực tiếp trên đối tượng kết quả.

function Shape(smth) { 
    var shape = Object.create(Shape.prototype); 

    shape.a = smth; 
    shape.b = 2; 
    shape.c = 3; 

    return shape; 
} 

này loại bỏ sự cần thiết của this chức năng Shape của bạn, có nghĩa là chúng ta không còn cần phải gọi nó với new một trong hai.

new Shape(1); // { a: 1, b: 2, c: 3, __proto__: Shape.prototype } 
Shape(1);  // { a: 1, b: 2, c: 3, __proto__: Shape.prototype } 

Tuy nhiên, bạn vẫn sẽ cần phải sử dụng this bên trong phương pháp mẫu thử để tham khảo ví dụ chính xác.

0

Nếu bạn muốn tránh "này", bạn có thể làm điều đó như thế này:

const shape = smth => { 
     let a = smth, 
      b = 2, 
      c = 3; 
     return { 
     doCalculus:() => a * b + c - (2 * (b + c) + a) 
     } 
    } 

    console.log(shape(2).doCalculus()); // -5 
Các vấn đề liên quan