-2

我可以在对象文字中声明原型吗?

var Obj = function(){
  var private = "Oh hi there I'm a private variable";
  return {
    init : function(param){
        this.param = 
        return this;
    }
    prototype.sayHi: function(){
        console.log("HI");
    }
  }
}

我现在可以打电话给“Obj.sayHi”吗?或者如果示例不可能,有没有办法做到这一点?

4

6 回答 6

0

只需在 JavaScript 控制台中尝试即可。由于您的示例充满了语法错误,请尝试运行以下命令:

var myObj = {
   prototype.blarg: function() { return 'blarg'; }
};

你会得到:

SyntaxError: missing : after property id
于 2012-09-26T22:45:52.550 回答
0

如果您问是否可以手动设置使用文字语法创建的对象的原型,官方的答案是否定的。

一种非标准语法可让您更改对象的原型。这是__proto__财产,但同样,它现在是非标准的。

var Obj = function(){
    var priv = "Oh hi there I'm a private variable";
    var o = {
       init : function(param){
           this.param = param;
           return this;
       }
    };

    o.__proto__ = {
        sayHi: function(){
            console.log("HI");
        }
    };
    return o;
}

同样,这是非标准的,所以要小心。

于 2012-09-26T22:53:58.017 回答
0

您可以使用本地函数创建带有原型的对象:

var Obj = function() {

    var private = "Oh hi there I'm a private variable";

    function create() {
        this.param = 42;
    }

    create.prototype = {

        sayHi: function() {
            console.log(private + this.param);
        }

    };

    return new create();

};

var x = Obj();
x.sayHi();

演示:http: //jsfiddle.net/Guffa/pZQnU/

于 2012-09-26T23:11:36.437 回答
0

如果您重新创建原型对象/覆盖它,您应该重置构造函数属性,因为它将被 Function() 覆盖。

var Person = function() {};
Person.prototype = {
    constructor: Person,
    someMethod: function() {}
};
于 2012-09-26T23:20:12.127 回答
0

你不明白的几件事:

  • 原型不是特定于对象的属性。它是用于制作它的函数的属性。
  • 在这种情况下,创建对象字面量的东西可以在 JavaScript 中创建所有内容

您可以直接从任何对象的构造函数属性访问原型,并且在大多数情况下至少添加属性(但您通常不能替换核心本机对象构造函数的整个原型)。在对象文字的情况下,它将是这样的:

var obj = {};

//BIG NOTE: don't do this in real code. Just goof around in a console or a test project
obj.constructor.prototype.sayHi = function(){ console.log('HI'); }

var anotherObj = {};
anotherObj.sayHi(); //'HI'

所以,是的,对吗?但这就是问题所在。这些也有效:

'bob'.sayHi();
[].sayHi();
new Date().sayHi();
document.sayHi();
(6).sayHi();//have to put 6 in parens because it handles '.' differently

对象字面量是使用核心 Object 构造函数创建的。对象构造函数有一个简单的实例,用作原型链开头的原型,用于 JavaScript 中几乎所有可以想象的事情。自prototype.js 以来没有人这样做过,因为很可能会出现严重奇怪的问题。

一般来说,无论您想对原型做什么,都可能会在不同的方向上进行更好的尝试。将您的对象文字设置为新函数构造函数的原型。这样你就有了继承选项,而不会破坏页面上的所有 JS。

通常认为弄乱 Object 构造函数的原型是一个非常糟糕的主意。我会说 Function.prototype 也是你想要远离的。不用于为其他本地构造函数构建原型对象的对象构造函数通常被认为是原型调整的公平游戏,因此我们可以做一些事情,例如在旧 IE 中添加缺少的数组方法。

于 2012-09-26T23:33:35.760 回答
0

我可以在对象文字中声明原型吗?

不。

或者如果示例不可能,有没有办法做到这一点?

建立原型继承的唯一方法是通过构造函数或Object.create. 在这两种情况下,您都可以将对象设置为[[Prototype]]使用对象文字,但您不能使用对象文字来创建对象实例并[[Protoype]]在一个文字中。

使用构造函数:

function Obj() {
}

Obj.prototype = {
   sayHi: function(){
            alert('Hi');
   }
};

var obj = new Obj();
obj.sayHi();

使用 Object.create

var obj = Object.create({sayHi: function(){alert('Hi');}});

var obj = Object.create(

  {sayHi: function(){alert('Hi');}},
  {
    init: {
      value: function(param) {
        alert(param);
      },
      writable: false
    }
  }
);


obj.sayHi();     // Hi
obj.init('foo'); // foo

请注意,Object.create 是 ES5,因此旧浏览器(例如 IE 7 和更低版本)不支持,但MDN上提供了修复程序。

于 2012-09-26T23:40:14.497 回答