//BaseCalculator で宣言された 10 進数属性は、電卓でアクセスできます。上記のコードを実行すると、Calculator のプロトタイプが BaseCalculator のインスタンスを指しているため、BaseCalculator のコンストラクターで宣言された属性値に Calculator がアクセスしたくない場合は、その DecimalDigits 属性値にアクセスできることがわかります。するの?これを実行します:
コードをコピーします
このようにして、計算結果には元の税金より 1 つ多くの税金が含まれます。値は 1 つですが、注意すべき点が 1 つあります。書き換えられたコードは、前のコードを上書きできるように最後に配置する必要があります。
Bar.prototype = new Foo(); >Bar.prototype .foo = 'Hello World';
// Bar.prototype.constructor を Bar 自体に修正します
Bar.prototype.constructor = Bar test = new Bar() // Bar の新しいインスタンスを作成します
// プロトタイプ チェーン
test [Bar のインスタンス]
Bar.prototype [Foo のインスタンス]
{ foo: 'Hello World ' }
Foo.prototype
{メソッド: ...};
Object.prototype
{toString: ... /* など */};
上記の例では、テスト オブジェクトは Bar.prototype と Foo.prototype を継承しているため、Foo のプロトタイプ メソッドにアクセスできます。同時に、プロトタイプで定義された Foo インスタンスのプロパティ値にもアクセスできます。 new Bar() は新しい Foo インスタンスを作成するのではなく、そのプロトタイプ上のインスタンスを再利用するため、すべての Bar インスタンスは同じ value プロパティを共有することに注意してください。
プロパティ検索:
オブジェクトのプロパティを探すとき、JavaScript は指定された名前のプロパティが見つかるまで、検索がプロトタイプ チェーンの先頭に到達するまで、プロトタイプ チェーンを上方向に走査します。は、Object.prototype - ただし、指定された属性がまだ見つからない場合は、unknown が返されます。例を見てみましょう:
function foo() {
this.add = function (x, y) {
return x y;
}
foo.prototype.add = function (x, y) {
return x y 10;
}
Object.prototype.subtract = function (x, y) {
return x - y;
}
var f = new foo();
alert(f.add(1, 2)); // 結果は 13 ではなく 3 です。
alert(f.subtract(1, 2)); //結果は -1
コードを実行すると、結果を取得するために、いわゆる上向き検索がインストールされることがわかります。 、ただし、追加方法は少し異なります。私が強調しているのは、属性を検索するときに、最初に自分の属性を検索し、プロトタイプがない場合は、プロトタイプを検索するということです。次に、それを Object のプロトタイプに挿入します。そのため、特定のレベルでは、for in ステートメントを使用してプロパティを走査する場合、効率も問題になります。
もう 1 つ注意する必要があるのは、プロトタイプには任意のタイプのオブジェクトを割り当てることができますが、アトミック タイプの値を割り当てることはできないということです。たとえば、次のコードは無効です。 >
コードをコピーします
hasOwnProperty 関数:
hasOwnProperty は Object.prototype のメソッドです。hasOwnProperty があるため、オブジェクトにプロトタイプ チェーンのプロパティの代わりにカスタム プロパティが含まれているかどうかを判断できます。プロトタイプチェーンを検索せずにプロパティを処理する唯一の関数です。
コードをコピー
コードは次のとおりです: // Object.prototype を変更 Object.prototype .bar = 1;
var foo = {goo: unknown};
foo.bar; // 1
'bar' // true
foo.hasOwnProperty('bar'); // false
foo.hasOwnProperty('goo'); // true
オブジェクトを走査するときに正しい結果を与えることができるのは hasOwnProperty だけですプロパティが役立つ場合があります。 プロトタイプ チェーン上のプロパティを除外するには、オブジェクト自体に定義されたプロパティ以外に方法はありません。
しかし、嫌なことがあります。JavaScript は hasOwnProperty が不法に占有されることを保護しないため、オブジェクトがたまたまこのプロパティを持っている場合、正しい結果を得るには外部の hasOwnProperty 関数を使用する必要があります。
コードをコピー
return false;
bar: 'Here be Dragons'
} // 常に false を返します。
// {} オブジェクトの hasOwnProperty を使用し、その上部と下部を foo に設定します
{}.hasOwnProperty.call(foo, 'bar') // true
;
hasOwnProperty は、オブジェクトにプロパティが存在するかどうかを確認するときに使用できる唯一のメソッドです。同時に、for in ループを使用してオブジェクトを走査する場合は、常に hasOwnProperty メソッドを使用することをお勧めします。これにより、プロトタイプ オブジェクトの展開による干渉が回避されます。
コードをコピーします
コードは次のとおりです:
}
us for in ステートメントの動作を変更する方法はないため、結果をフィルターしたい場合は、hasOwnProperty メソッドのみを使用できます。コードは次のとおりです。
コードをコピー
コードは次のとおりです:
// foo 変数は上記の例の変数です。
for(var i in foo) {
if (foo.hasOwnProperty(i)) {
console.log(i) );
}
}
このバージョンのコードが唯一の正しい書き方です。 hasOwnPropertyを使用したので、今回はmooのみが出力されます。 hasOwnProperty が使用されていない場合、ネイティブ オブジェクト プロトタイプ (Object.prototype など) が拡張されるときにこのコードが壊れる可能性があります。
要約: hasOwnProperty を使用し、コードが実行される環境についていかなる仮定も立てず、ネイティブ オブジェクトが拡張されているかどうかも仮定しないことをお勧めします。
まとめ
プロトタイプによって開発コードは大幅に充実しましたが、日常の使用では上記の注意事項のいくつかに注意する必要があります。