JavaScriptの対象のconstructor属性の紹介

6404 ワード

例1:/定義コンストラクタfunction P(age){this.age=age;//プロトタイプ追加方法P.prototype.wel=function(){consosolie.logn(this.age);////pオブジェクトvar p=new P(21)//テスト対象の方法p.wel()//21/テスト対象のconstructor属性p.co.nstructor;/function P(age){this.age=age}この例のオブジェクトのconstructor属性は構造関数を指すのが正しいですが、以下の例を見てください.例2:/定義コンストラクタfunction P(age){this.age=age;//プロトタイプ追加方法P.prototype={wel:function(){consolie.logn(this.age)}pオブジェクトvar p=new P(21)//テスト対象の方法p.wel()//21/テスト対象のconstructor属性p.co.nstructor;/function Object(){native code}
その結果、例1と例2のコンストラクタの機能は同じですが、実用化されたオブジェクトにも機能的な方法がありますが、コンストラクタのプロトタイプオブジェクトを定義する方法が違いますので、例1はプロトタイプオブジェクトのある属性だけを単独に変更しました.しかし、用例2この方法は構造関数を作る場合が多いはずで、So,constructorという属性は非常に信頼できない.上の例からもわかるように、constructor属性は、実際にオブジェクトの属性ではなく、構造関数の原型オブジェクトのconstructor属性である.p.hasOwn Property(「constructor」);false.P.prototype.hasOwn Property(「constructor」);truep.co nstructorは、プロトタイプチェーンを介してプロトタイプのオブジェクトを見つけるconstructorのプロパティです.
例2について、Pのプロトタイプ.co nstructor属性に手動で値Pを割り当てると、P.prototype.com nstructor=Pとなる.これは個人の習慣次第です.
JavaScriptのオブジェクトのconstructor属性の紹介から.
以下はオリジナルです
上記の抜粋内容はすべて対象のconstructor属性で、対象はすべてconstructor属性があり、constructorは現在のオブジェクトを作成する関数(javascript高級プログラム設計)を保存するために使用されます.上記の実験を通して、正確に言えば、インスタンスオブジェクトのconstructor属性は、その構造関数のプロトタイプオブジェクトのconstructor属性に等しいことが分かります.
このように関数タイプも対象ですので、関数タイプもconstructor属性があります.そのconstructor属性は一般的にFunction(){[native code]です.
function P(age){
this.age=age;
}
P.constructor  //console:  function Function() { [native code] }
しかし、constructorの属性は変更できますので、本当にオブジェクトを指すコンストラクタとは限りません.(よく知られているように、JavaScriptの対象のconstructor属性の役割は何ですか?)
コンストラクタが戻り値がある場合、newコンストラクタによって得られたのは、コンストラクタの例のオブジェクトではなく値だけを返します.
function P(){
  function setAge(age){
    this.age=age;
 }
  return setAge;
}
var setAgeFun = new P();
setAgeFun.constructor    //console:  function Function() { [native code] }
どのようにして戻り値をコンストラクションの実例的なオブジェクトにしますか?このヒント効果がありますか?
constructorの属性は変更できますので、戻り値のconstructor属性をコンストラクタに等しくするだけでいいです.
function P(){
  function setAge(age){
    this.age=age;
 }
  setAge.constructor=P;
  return setAge;
}
var setAgeFun = new P();
setAgeFun.constructor
/* console: function P(){
  function setAge(age){
    this.age=age;
 }
  setAge.constructor=P;
  return setAge;
} */
ps(個人的な見解):javaの中のコンストラクタは戻り値がないので、newコンストラクタは必ずインスタンスオブジェクトであるが、javascriptでは関数は値を返してもいいので、戻り値のあるコンストラクターに対しては、
newが出てきたら、インスタンスオブジェクトではありません.
また、オブジェクトにも属性があります.proto_,暗黙のプロトタイプと呼ばれることができ、オブジェクトの暗黙のプロトタイプは、オブジェクトを構成するコンストラクタのプロトタイプを指し、これはまた、インスタンスがコンストラクタプロトタイプにおいて定義された属性および方法にアクセスできることを保証する.
メソッド(Function)メソッドという特殊な対象は、他のオブジェクトと同様に上記のような_があります.プロト属性以外にも、自分特有の属性であるプロトタイプの属性があります.この属性は一つの指針であり、一つのオブジェクトを指します.このオブジェクトの用途は、すべてのインスタンスで共有される属性と方法を含みます.プロトタイプのオブジェクトにも属性があります.constructorといいます.この属性にはポインタが含まれています.元のコンストラクタを返します.
Mootool.jsでclassを作成するソースコードを簡略化して解読しました.
var Class =function(){
   console.log("              ,       ");
   var klass =function(){
      console.log("     ,           ,        ");
   }
   klass.constructor = Class;
   return klass;
}
var people = new Class();   // console:              ,       

var person =new people()    // console:      ,           ,        

people.constructor
/* console: 
function(){
   console.log("              ,       ");
   var klass =function(){
      console.log("     ,           ,        ");
   }
   klass.constructor = Class;
   return klass;
} */
person.constructor
/* console:
function(){
      console.log("     ,           ,        ");
   } */
備考:var people=newクラス(); var person=new people()は関数コリック化の知識を使っていることが分かります.クラスの書き方は関数の戻り関数の書き方です.
私たちは以下の2つの書き方を比較します.
var Class =function(){
   console.log("              ,       ");
   var klass =function(){
      console.log("     ,           ,        ");
   }
   return klass;
}
var people = new Class();   // console:              ,       

var person =new people()    // console:      ,           ,        

people.constructor

//console: Function() { [native code] }

person.constructor
/* console:
function(){
      console.log("     ,           ,        ");
   }
*/
var Class =function(){
   console.log("              ,       ");
   var klass =function(){
      console.log("     ,           ,        ");
      this.constructor = klass;
   }
   klass.constructor = Class;
   return klass;
}

var people = new Class();   // console:              ,       


var person =new people()    // console:      ,           ,        


people.constructor
/* console: 
var Class =function(){
   console.log("              ,       ");
   var klass =function(){
      console.log("     ,           ,        ");
      this.constructor = klass;
   }
   klass.constructor = Class;
   return klass;
} */

person.constructor
/* console: 
function(){
      console.log("     ,           ,        ");
      this.constructor = klass;
   } */
わかる
var Class =function(){
   console.log("              ,       ");
   var klass =function(){
      console.log("     ,           ,        ");
      this.constructor = klass;      //        ,     klass       
   }
   klass.constructor = Class;   /*     klass     Class           ,     ,
                                    constructor   function.prototype constructor   */
   return klass;
}
最後にMootools.jsでクラスを作成するソースを添付します.
var Class = function(properties) {   //  properties       properties        
  properties = properties || {};
  var klass = function() {
    for ( var key in this) {
      if (typeof this[key] != 'function')
        this[key] = $.unlink(this[key]);  //        
    }
    this.constructor = klass;      
    if (Class.prototyping)
      return this;
    var instance = this.initialize ? this.initialize.apply(this, arguments)
        : this;  //      initialize  ,  initialize          
    //typize
    this.$$family = 'class';
    return instance;
  };
 
  for ( var mutator in Class.Mutators) {
    if (!properties[mutator])
      continue;
    properties = Class.Mutators[mutator](properties, properties[mutator]);  //properties   implements  ,           
    delete properties[mutator];
  }
 
  $.extend(klass, this);
  klass.constructor = Class;
  klass.prototype = properties;  
  return klass;
};