我可以将原型放在对象文字中吗?

时间:2012-09-26 22:41:27

标签: javascript

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

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”吗?或者,如果无法提供示例,还有办法吗?

6 个答案:

答案 0 :(得分:0)

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

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

你会得到:

SyntaxError: missing : after property id

答案 1 :(得分: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;
}

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

答案 2 :(得分: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/

答案 3 :(得分:0)

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

var Person = function() {};
Person.prototype = {
    constructor: Person,
    someMethod: function() {}
};

答案 4 :(得分:0)

你不理解的一些事情:

  • prototype不是特定于该对象的属性。它是用于制作它的函数的属性。
  • 在这种情况下,制作对象文字的东西可以在用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中添加缺少数组方法的操作。

答案 5 :(得分: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上提供了修复。