繁体   English   中英

对象文字作为原型

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

  1. 运行时查看inst并检查对象是否具有为属性literal指定的值。
  2. inst dos没有这样的属性,因此运行时继续使用其prototype属性
  3. inst.prototype引用它初始化的文字对象。 此对象为属性literal指定了值。
  4. 因此, inst.literal会计算嵌套的文字inst.prototype.literal
  5. 文字对象确实具有属性init的值
  6. 调用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;

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

如果我理解正确他们说你可以用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM