たとえば、アプリ内で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
}
}