[英]Object literal as prototype
这个问题更多的是关于支持和向后兼容性。 我测试了以下代码。
function newFunc() {}
newFunc.prototype = {
literal : {
init : function() {
console.log(this);
this.test();
},
test : function() {
console.log('test');
}
}
}
var inst = new newFunc();
inst.literal.init();
这是有效的,虽然我没有在任何其他代码中看到对象文字作为原型。 是否有一个原因? 这对我来说似乎是一种合乎逻辑的编码方式,但如果它有严重的陷阱,我不想追求它。
使用对象文字来为函数创建原型是完全正常的,但通常只作为prototype
对象的实际值。
做什么是不寻常的,并在原型中包含嵌套对象。
实际上,您只在原型中添加了一个对象,即一个名为literal
。 然后,所有方法都是该对象的属性。 它在技术上是有效的语法,但我以前从未见过它。 作为@squint在评论中指出的,它也出现突破的方式,将this
变量的作品,因为它结合this
到在函数调用中使用的“下左”属性:
var inst = new newFunc();
inst.literal.init();
> Object { init: function, test: function }
即,已this
设置为指向.literal
对象,而不是指向已创建的实际实例。
是的,使用prototype
文字是正确的。 例如,Mozilla在原型文档中明确使用了一个文字:
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
(请参阅此处的说明)。
使用嵌套的文字并没有什么区别。 在问题中,原型设置为{ literal : { ... } }
。 调用inst.literal.init()
时实际发生的事情是:
inst
并检查对象是否具有为属性literal
指定的值。 inst
dos没有这样的属性,因此运行时继续使用其prototype
属性 inst.prototype
引用它初始化的文字对象。 此对象已为属性literal
指定了值。 inst.literal
会计算嵌套的文字inst.prototype.literal
init
的值 init()
函数 这是JavaScript(ECMA Script)的原则之一,因此不存在兼容性问题。
您正在做的是将原型设置为具有多个属性的JavaScript对象 。 这是完全可以接受的,因为函数的行为与JavaScript中的对象非常相似。 所有JavaScript都将对此prototype属性的引用传递给继承的对象,因此它们不具有可以访问的函数,而是在这种情况下的对象。
您可以看到这实际上是在MDN文档中完成的:
var Person = {
canTalk : true,
greet : function() {
if (this.canTalk) {
console.log("Hi, I'm "+this.name)
}
}
}
Customer.prototype = Person;
如果我理解正确他们说你可以用javascript(ECMA SCRIPT)
http://en.wikipedia.org/wiki/Literal_(computer_programming)
但我所知道的是,如果你想要实例化你的对象,旧浏览器就会出现问题..你不能使用Object.create()函数实例化对象
所以你一般应该这样做......
var foo = function(){};
foo.prototype = {func:function(){}}
var bar = new foo();
就像你这样左右:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.