2012-03-21 44 views
16

Có thể tạo đối tượng mới bằng chuỗi không? Ví dụ: làm cách nào tôi có thể chuyển đổi chuỗi "sản phẩm" thành var p = new Product?Tạo đối tượng từ chuỗi

Xin cảm ơn trước.

EDIT

Những gì tôi muốn làm là để có một menu với <a href="#home"></a><a href="#products">products</a> và tạo ra các đối tượng tương ứng từ href mỗi lần.

+0

những gì bạn hy vọng sẽ làm gì với nó? – Joseph

+1

Quy tắc để chuyển 'product' thành' var p = new Product' là gì? Tôi có thể hiểu 'Sản phẩm mới', nhưng tại sao 'p'? –

+0

@chchrist: Điều đó nghe có vẻ nguy hiểm, đặc biệt nếu chuỗi xuất phát từ người dùng ... tại sao bạn nghĩ đó là một ý tưởng hay? Bạn đã xem xét bất kỳ phương pháp tiếp cận thay thế? –

Trả lời

60

Nếu bạn biết ngữ cảnh, vâng. Giả sử bạn đang ở trong môi trường trình duyệt và Person là một nhà xây dựng toàn cầu. Bởi vì bất kỳ biến toàn cầu là một thuộc tính của đối tượng toàn cầu, nó có nghĩa là bạn có thể truy cập vào Person thông qua đối tượng toàn cầu window:

var p = new Person() 

Tương đương với:

var p = new window.Person() 

Vì vậy, bạn có thể sử dụng dấu ngoặc vuông ký hiệu:

var p = new window["Person"](); 

Tất nhiên điều này hợp lệ cho mọi loại đối tượng. Nếu bạn không muốn làm ô nhiễm phạm vi toàn cầu, bạn có thể có:

var mynamespace = {}; 

mynamespace.Person = function Person() {..} 

var p = new mynamespace["Person"](); 
+3

Đó là một giải pháp đẹp hơn tôi +1 –

+0

Tôi đã cố gắng tạo một đối tượng bằng cách sử dụng cửa sổ mới [" Namespace.MyClass "](), nhưng có vẻ như nó không hoạt động. Làm thế nào chúng ta có thể tạo ra các đối tượng khi lớp chứa trong các mô-đun? –

+0

@NarendraV thử cửa sổ mới ["Không gian tên"] ["MyClass"]()?(Đây chỉ là một đoán, tôi không biết rằng điều này sẽ làm việc) –

6

Bạn luôn có thể sử dụng eval không an toàn và không được bảo đảm(). ví dụ:

var myStr = "Product" 
var p = eval("new " + myStr + "()"); 

hoặc đó có thể là:

var myStr = "Product" 
eval("var p = new " + myStr + "()"); 

Nhưng nó đầy các lỗ hổng tiềm năng, đặc biệt là nếu chuỗi là đến từ người dùng nhập vào.

+0

thử tìm kiếm "sử dụng nghiêm ngặt" cho eval – Joseph

+2

Điều này có thể được giải quyết tốt hơn với bản đồ 'name -> constructor function'. –

+0

+1 Khi đầu vào được tạo bởi một chương trình, hoàn hảo – smirkingman

1

Just another thực hiện:

var nameOfThang = 'Person'; 
var nameOfThingzName = 'The Dude'; 

var thangs = { Person: {name: 'Legowski'}, Cars: {} }; 
var person = new (eval(thangs[nameOfThang].constructor))(); 
person.name = new (eval(thangs.Person.name.constructor))(nameOfThingzName) .toString(); 

console.log('@thang, #Person', person); 
Các vấn đề liên quan