何がオブジェクトとの取引です.プロトタイプ.Hasownproperty.コール()
10841 ワード
誰かがコードを読んでいるか図書館でも、次のコード行を見たかもしれません.
私はいくつかの目的のためにこのコードを選びました、そして、これを解明することによって、我々は以下のことを理解します: オブジェクトとはプロトタイプ? オブジェクトを実装せずに機能をどのように借りるか、またはプロトタイプのチェーンにそれを持つことはできますか? なぜ我々はアクセス これがあなたに興味をそそられるならば、始めましょう.
1 .オブジェクトプロトタイプ
Prototypal inheritance JavaScript言語の主要な柱の1つであり、オブジェクトがそのプロトタイプにメソッドとプロパティを継承できるようにします.プロトタイプをテンプレートと考えることができます.
例で理解するほうがいい.
これはプロトタイプの継承とプロトタイプチェーンの仕組みによって可能です.少し深く掘りましょう.
リテラルオブジェクトを作成したとき
プロトタイプのチェーンは次のようになります.
したがって、我々が起動したとき
さらに、我々はオブジェクトを使用して、しかし、我々はプロトタイプチェーンを設定またはオーバーライドすることができます.setPrototyPeople ()メソッドまたはオブジェクトを使用します.create ()を使用します.
次の例を考えます.
2 .関数の借入
次の関数とオブジェクトがあるかどうかを考えてみましょう
その答えは
JavaScriptでは、作成するすべての関数が関数から継承します.プロトタイプ.
そして、プロトタイプのチェーンを通して、すべての関数オブジェクトにcallメソッドを使用することができました.💡
の構文call method は
だから、借りるために
3 .オブジェクトプロトタイプ.HasownProperty対インスタンスハスターン
プロトタイプの継承と借用関数の軽量なチュートリアルの後、最終的には、オブジェクトにHasownPropertyを使用する理由を説明します.オブジェクトインスタンスではなくプロトタイプです.
上で述べたように、我々はプロトタイプチェーンを自分でコントロールすることができます.一つの方法はObject.create() オブジェクトインスタンスの作成中.
あなたがライブラリを作成して、引数としてオブジェクトを受け入れる機能を公開していると想像してください.あなたの機能が使用するならば
したがって、この問題を回避するために、我々が以前に学んだ機能借入技術を使用することができます.渡されたオブジェクト引数は借りることができます
概要 すべてのオブジェクトリテラルはオブジェクトから継承します.プロトタイプ.これにより、いくつかのメソッドを呼び出すことができます オブジェクトの助けを借りてプロトタイプチェーンをオーバーライド/作成できます.SetPrototyOfメソッドとViaオブジェクト.を作成します. すべての関数は関数から継承します.プロトタイプのようなメソッドを消費することができます オブジェクトはそれらを実装せずに他の関数を借りることができます.これは 用途 もうこれだけです.私はあなたがこの記事を読んで楽しんで、いくつかのことを学んだことを願っています.他のユーザーと共有する😍.
Object.prototype.hasOwnProperty.call(objRef, 'propName');
そして今、あなたはこのコードが何をしているのか疑問に思っています.あなたのJavaScriptのスキルを疑うを開始します.心配するな.あなたは適切な場所にいる.私はいくつかの目的のためにこのコードを選びました、そして、これを解明することによって、我々は以下のことを理解します:
hasOwnProperty
オブジェクトのプロトタイプで、インスタンス自体ではありませんか?1 .オブジェクトプロトタイプ
Prototypal inheritance JavaScript言語の主要な柱の1つであり、オブジェクトがそのプロトタイプにメソッドとプロパティを継承できるようにします.プロトタイプをテンプレートと考えることができます.
Prototypal inheritance allows an object to inherit methods and properties on its prototype.
例で理解するほうがいい.
var obj = {name: 'aman'}
obj.hasOwnProperty(‘name’) // returns true
ご覧のように、定義されていませんhasOwnProperty
我々のobj
しかし、私たちは何とかしてそれを起動させました.どのように可能ですか?🤔これはプロトタイプの継承とプロトタイプチェーンの仕組みによって可能です.少し深く掘りましょう.
リテラルオブジェクトを作成したとき
obj
, プロトタイプをオブジェクトに設定しました.プロトタイプ.確認するには、Object.getPrototypeof(obj) === Object.prototype // returns true
[プロトタイプ]はオブジェクト間の継承関係です.私たちの場合、ObjのプロトタイプとOBJの関係です.プロトタイプのチェーンは次のようになります.
// Prototype chain
obj —-> Object.prototype ——> null
オブジェクトのプロパティにアクセスしようとすると、インタプリタはまずオブジェクトそのものを探します.オブジェクトのプロパティを見つけることができない場合は、チェーン内のプロパティを検索するまでトラバースします.したがって、我々が起動したとき
hasOwnProperty()
, 通訳はそれを見つけられなかったobj
, それで、それはチェーンで上へ横断して、オブジェクトの上でそれを見つけます.プロトタイプ.さらに、我々はオブジェクトを使用して、しかし、我々はプロトタイプチェーンを設定またはオーバーライドすることができます.setPrototyPeople ()メソッドまたはオブジェクトを使用します.create ()を使用します.
次の例を考えます.
var person = {name: 'peter'};
var PersonPrototype = {getName: function(){ return this.name; }};
// Setting person's prototype
Object.setPrototypeOf(person, PersonPrototype);
// Trying to access getName() method will cause a prototype chain lookup (aka prototype delegation)
// and finds it on PersonPrototype.
person.getName(); // 'peter'
2 .関数の借入
次の関数とオブジェクトがあるかどうかを考えてみましょう
function sayHello() { console.log(`Greetings ${this.name}`) }
var a = {name: 'peter'};
どうやってオブジェクトを作るのa
借用するsayHello
, と挨拶の正しい名前を呼び出しますか?私たちはa
実施するsayHello
またはそのプロトタイプチェーン上の任意の場所があります.🤔その答えは
call
and apply
関数で利用できるメソッド.プロトタイプ.JavaScriptでは、作成するすべての関数が関数から継承します.プロトタイプ.
そして、プロトタイプのチェーンを通して、すべての関数オブジェクトにcallメソッドを使用することができました.💡
In JavaScript, every function we create inherits from Function.prototype.
の構文call method は
// 'call' method is available on Function.prototype
func.call(objRef, ...args);
最初の引数は、この関数を借用したいオブジェクトです.だから、借りるために
sayHello
, 私たちがしなければならないのはcall
メソッドオンsayHello
Aを引数として渡すsayHello.call(a); // Greetings peter
3 .オブジェクトプロトタイプ.HasownProperty対インスタンスハスターン
プロトタイプの継承と借用関数の軽量なチュートリアルの後、最終的には、オブジェクトにHasownPropertyを使用する理由を説明します.オブジェクトインスタンスではなくプロトタイプです.
上で述べたように、我々はプロトタイプチェーンを自分でコントロールすることができます.一つの方法はObject.create() オブジェクトインスタンスの作成中.
// Object.create() accepts an argument which becomes
// the prototype for newly created object.
var a = Object.create(null); // Setting `null` as prototype for 'a'.
// Adding a 'name' property on the instance
a.name = 'peter';
// Using `hasOwnProperty` method would cause an error
a.hasOwnProperty('name'); //🚫 throws a TypeError: a.hasOwnProperty is not a function
呼び出すhasOwnProperty
オブジェクトまたはそのプロトタイプチェーンで使用可能なメソッドがないので、エラーをスローします.プロトタイプのチェーンは次のようなものでした.// Prototype chain
a ---> null
誰かがなぜこのようなオブジェクトを作成するのか疑問に思うかもしれません.しかし、皮肉なことはJavascriptであなたが望むように狂っていることが許されていることです🔥. あなたがライブラリを作成して、引数としてオブジェクトを受け入れる機能を公開していると想像してください.あなたの機能が使用するならば
hasOwnProperty
オブジェクトが直接外部から渡されると、誰かがオブジェクトを渡すとコードが壊れますnull
プロトタイプです.したがって、この問題を回避するために、我々が以前に学んだ機能借入技術を使用することができます.渡されたオブジェクト引数は借りることができます
hasOwnProperty
オブジェクトで利用可能です.我々が以前に学んだようにプロトタイプcall
メソッド.🚀😇.// Will not break your code if 'a' has a null prototype. ✅
Object.prototype.hasOwnProperty.call(a, 'name'); // true;
概要
hasOwnProperty
. call
, apply
, and bind
. call
or apply
利用可能なメソッドFunction.prototype
. Object.prototype.hasOwnProperty.call(objRef, 'propName')
objrefが持つときにTypeErrorをガードするにはnull
プロトタイプ.Reference
この問題について(何がオブジェクトとの取引です.プロトタイプ.Hasownproperty.コール()), 我々は、より多くの情報をここで見つけました https://dev.to/aman_singh/what-s-the-deal-with-object-prototype-hasownproperty-call-4mbjテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol