对象文字作为原型

时间:2013-05-29 13:02:47

标签: javascript

这个问题更多的是关于支持和向后兼容性。我测试了以下代码。

function newFunc() {}

newFunc.prototype = {

    literal : {
        init : function() {
            console.log(this);
            this.test();
        },
        test : function() {
            console.log('test');
        }
    }
}

var inst = new newFunc();

inst.literal.init();

虽然我没有在任何其他代码中看到对象文字作为原型,但这是有效的。是否有一个原因?这似乎是一种合乎逻辑的编码方式,虽然如果它有严重的陷阱我不想追求它。

4 个答案:

答案 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()时实际发生的事情是:

  1. 运行时查看inst并检查对象是否具有为属性literal指定的值。
  2. inst dos没有这样的属性,因此运行时继续其prototype属性
  3. inst.prototype引用它初始化的文字对象。此对象为属性literal分配了一个值。
  4. inst.literal因此评估为嵌套文字inst.prototype.literal
  5. 文字对象确实具有属性init
  6. 的值
  7. init()函数名为
  8. 这是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;

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FObject%2Fprototype

答案 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();

就像你这样做:)