这个问题更多的是关于支持和向后兼容性。我测试了以下代码。
function newFunc() {}
newFunc.prototype = {
literal : {
init : function() {
console.log(this);
this.test();
},
test : function() {
console.log('test');
}
}
}
var inst = new newFunc();
inst.literal.init();
虽然我没有在任何其他代码中看到对象文字作为原型,但这是有效的。是否有一个原因?这似乎是一种合乎逻辑的编码方式,虽然如果它有严重的陷阱我不想追求它。
答案 0 :(得分:2)
使用对象文字为函数创建原型是完全正常的,但通常只作为prototype
对象的实际值。
做什么是不寻常的,并在原型中包含嵌套对象。
实际上,您只将一个对象添加到原型中,即名为literal
的原型。然后,所有方法都是该对象的属性。它在技术上是有效的语法,但我以前从未见过它。正如@squint在注释中指出的那样,它似乎也打破了this
变量的工作方式,因为它将this
绑定到函数调用中使用的“next left”属性:< / p>
var inst = new newFunc();
inst.literal.init();
> Object { init: function, test: function }
即。 this
已设置为指向.literal
对象,而不是指向已创建的实际实例。
答案 1 :(得分:1)
是的,使用prototype
的文字是正确的。例如,Mozilla在原型documentation中明确使用了一个文字:
var Customer = function(name) {
this.name = name;
}
var Person = { // this is a literal
canTalk : true,
greet : function() { /* ... */ }
}
Customer.prototype = Person;
一些解释:prototype
的值是对象。创建对象的方式并不重要 - 简单地使用{}
就可以了。它通常使用MyClass1.prototype = new MyClass2()
之类的东西初始化,但new
只是创建一个新对象。它还设置prototype
属性并在新对象上执行构造函数(MyClass2
)但,它不会以任何方式影响MyClass1
(见解释here)。
使用嵌套文字并没有什么不同。在问题中,原型设置为{ literal : { ... } }
。致电inst.literal.init()
时实际发生的事情是:
inst
并检查对象是否具有为属性literal
指定的值。inst
dos没有这样的属性,因此运行时继续其prototype
属性inst.prototype
引用它初始化的文字对象。此对象已为属性literal
分配了一个值。inst.literal
因此评估为嵌套文字inst.prototype.literal
init
init()
函数名为这是JavaScript(ECMA Script)的原则之一,因此不存在兼容性问题。
答案 2 :(得分:0)
您正在做的是使用多个属性设置原型to be a JavaScript object。这是完全可以接受的,因为函数的行为与JavaScript中的对象非常相似。所有JavaScript都将对此prototype属性的引用传递给继承的对象,因此它们不具有可以访问的函数,而是在这种情况下是对象。
您可以看到这实际上是在MDN文档中完成的:
var Person = {
canTalk : true,
greet : function() {
if (this.canTalk) {
console.log("Hi, I'm "+this.name)
}
}
}
Customer.prototype = Person;
答案 3 :(得分:-1)
如果我理解正确,他们说你可以用javascript(ECMA SCRIPT)
来做到这一点http://en.wikipedia.org/wiki/Literal_(computer_programming)
但我所知道的是,如果你想要实例化你的对象,旧浏览器就会出现问题..你不能用Object.create()函数实例化对象
所以你通常应该这样做......
var foo = function(){};
foo.prototype = {func:function(){}}
var bar = new foo();
就像你这样做:)