2

たとえば、アプリ内でprototype.jsを使用すると、ライブラリはオブジェクトプロトタイプをいくつかの追加要素で拡張します。

// the code is not exactly like this but that doesnt matter
Object.prototype.inspect = function...

私がいくつかのオブジェクトを作成するとき、そのオブジェクトは決して「検査」する独自のプロパティを持っていません。これはもちろん正しいです:

// false
{}.hasOwnProperty('inspect');

このようにオブジェクト リテラルを作成すると、このオブジェクト リテラルを介して作成されたプロパティは ownproperties になります。もちろん、これも正しいです。

var myObj = {
   myProp: 'myVal'
};

// this would return true here
myObj.hasOwnProperty('myProp');

しかし、新しい演算子を使用してオブジェクトを作成すると、関数内のプロパティでさえ所有プロパティとして認識されません。

function MyTest () {}

MyTest.prototype.myProp = function () {};

var myObj = new MyTest();

// this would return false here

myObj.hasOwnProperty('myProp');

誰かがなぜそうなのか説明できますか?オブジェクトを反復処理し、Objects.prototype の一部ではない (したがって、prototype.js で作成されていない) プロパティのみを含む新しいオブジェクトを作成します。

EDIT:私はmyObjを作成するコードの所有者ではなく、どのFunction-ConstructorがmyObjを作成するのかわかりません

EDIT2:ニコのおかげで、それが私が今やっている方法です:

var key, newObj = {};
for (key in oldObj) {
  if (typeof newObj[key] == 'undefined') {
    newObj[key] = oldObj[key];
  }
}
for (key in newObj) {
  if (newObj.hasOwnProperty(key)) {
    // do some stuff here with properties that did not came from the objects.prototype
  }
}
4

2 に答える 2

3

の唯一の目的はhasOwnProperty、実際のオブジェクト (別名インスタンス) に関連付けられたプロパティと、プロトタイプに関連付けられたプロパティを区別することです。演算子を介してインスタンスを構築する場合new、新しいインスタンスは構築元の関数のプロトタイプにリンクされます - プロトタイプのプロパティは新しいインスタンスにコピーされません!

Object.prototype にないものをすべてコピーするには、次のように考えてください。

var newObj = {};
for (var key in oldObj) {
    if (typeof newObj[key] == 'undefined') {
        newObj[key] = oldObj[key];
    }
}

newObjただし、Object.prototype のプロパティは、もちろん Object のインスタンスであるため、引き続きアクセスできます。

于 2013-02-26T14:26:05.550 に答える
1

に割り当てられているためprototype、実際には、オブジェクトのあいまいなクラスまたは先祖を作成し、それにプロパティを与えることに少し似ています。プロパティが に直接割り当てられたことはありませんmyObj

myObjコンストラクターではなくプロトタイプを直接適用することも、プロトタイプを呼び出さずにmyProp直接適用することもでき、それでも独自のプロパティではないことに注意してください。myTestmyPropmyObj

于 2013-02-26T14:26:13.610 に答える