何がオブジェクトとの取引です.プロトタイプ.Hasownproperty.コール()


誰かがコードを読んでいるか図書館でも、次のコード行を見たかもしれません.
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 .
  • オブジェクトの助けを借りてプロトタイプチェーンをオーバーライド/作成できます.SetPrototyOfメソッドとViaオブジェクト.を作成します.
  • すべての関数は関数から継承します.プロトタイプのようなメソッドを消費することができますcall , apply , and bind .
  • オブジェクトはそれらを実装せずに他の関数を借りることができます.これはcall or apply 利用可能なメソッドFunction.prototype .
  • 用途Object.prototype.hasOwnProperty.call(objRef, 'propName') objrefが持つときにTypeErrorをガードするにはnull プロトタイプ.
  • もうこれだけです.私はあなたがこの記事を読んで楽しんで、いくつかのことを学んだことを願っています.他のユーザーと共有する😍.