7

私は次のようなことをしてJavaScriptオブジェクトを作成しています:

function field(name,label){
        this.name = name
        this.label= label;
}

var a = new field("market","Mkt").

次に、 a を別のオブジェクトに割り当てます。

object.newField = a;

2 つ目の方法は、新しいプロパティを直接作成することです。

object.2ndNewField = {
    name: "market2",
    label:"Mkt2"
}

他の関数でオブジェクトを読み取ろうとします。オブジェクトの動作は異なりますが、オブジェクトを文字列化すると問題ないように見えます。私が作成した 2 つのプロパティの違いは何ですか?

ところで、次のオブジェクトの違いはありますか?

 object.2ndNewField = {
        "name": "market2",
        "label":"Mkt2
    }
4

2 に答える 2

6

違いは、最初のケースでは、作成されたオブジェクトが field.prototype から継承し、次にObject.prototype継承することです(つまり、その内部 [[Prototype]] は field.prototype であり、その内部 [[Prototype]] はObject.prototype です)。 2 番目のケースでは、Object.prototypeからのみ継承します。

それを見る別の方法は次のとおりです。

object.newField instanceof field; // true
object.newField instanceof Object; // true

object.newField2 instanceof field; // false
object.newField2 instanceof Object; // true

または継承チェーンは次のとおりです。

object.newField  -> field.prototype -> Object.prototype -> null

object.newField2 -> Object.prototype -> null

「->」は「継承元」を意味します。

于 2011-07-12T01:41:50.690 に答える
1

最初のオプションの場合...「new」を使用しないでください。「new」を間違って使用したり、使用する必要があるときに省略したりすると、グローバル名前空間に悪影響を与える可能性があります。さらに、コード内のいくつかの場所での「this」の使用には注意する必要があります。これは、そうでないと思われるもの、またはグローバル データにバインドされる可能性があるためです。

あなたが与えた2番目のオプションでは、データ/メソッドのコレクションとしてのみ使用されるオブジェクト(つまり、「クラスのような」動作ではない)に安全に使用できます。プライベートおよびパブリック変数/メソッドで複数のインスタンスを作成でき、継承できるものが必要な場合は、オブジェクトを返す関数を使用する必要があります。

基本オブジェクトを安全に作成し、継承を使用する方法について、かなり大きな記事と例をここに書きました。リンクをたどると、この投稿ですべてを再入力しなかった理由がわかります;)。

お役に立てれば...

于 2011-07-12T02:48:15.917 に答える