-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 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

オブジェクトリテラルは、コアオブジェクトコンストラクター関数を使用して作成されます。オブジェクトコンストラクターには、JavaScriptで考えられるほぼすべてのことについて、プロトタイプチェーンの最初にプロトタイプとして使用される単純なインスタンスがあります。深刻な奇妙な問題が発生する可能性が高いため、prototype.js以降誰もこれを行っていません。

一般的に言って、プロトタイプでやりたいことは、別の方向で試みたほうがよいかもしれません。オブジェクトリテラルを新しい関数コンストラクターのプロトタイプとして設定します。そうすれば、ページ上のすべてのJSを爆破することなく、継承オプションを利用できます。

オブジェクトコンストラクターのプロトタイプをいじることは、一般的に非常に悪い考えと考えられています。Function.prototypeも避けたいものだと思います。他のネイティブコンストラクターのプロトタイプオブジェクトの構築に使用されないオブジェクトコンストラクターは、通常、プロトタイプ調整の公正なゲームと見なされるため、たとえば、古いIEで欠落している配列メソッドを追加するなどのことができます。

于 2012-09-26T23:33:35.760 に答える
0

プロトタイプ オブジェクトを再作成/上書きする場合は、Function() でオーバーライドされるため、コンストラクター プロパティをリセットする必要があります。

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

オブジェクト リテラルでプロトタイプを宣言することはできますか?

いいえ。

または、例が不可能な場合にこれを行う方法はありますか?

プロトタイプの継承を確立する唯一の方法は、コンストラクターまたはObject.create. どちらの場合も、オブジェクト リテラルを使用してオブジェクトを使用するように設定でき[[Prototype]]ますが、オブジェクト リテラルを使用してオブジェクト インスタンスを作成[[Protoype]]し、1 つのリテラルで使用することはできません。

コンストラクターの使用:

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 に答える
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

Just try it in a JavaScript console. Since your example is full of syntax erors, try and run the following:

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

You'll get:

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 に答える