プロトタイプチェーンおよび継承
5528 ワード
プロトタイプチェーン
プロトタイプチェーンは、ほとんどの
このうち
継承方法について親設定 .親設定 を継承する.親の .親設定子をインスタンス化する .親 .
プロトタイプチェーン関連メソッド
判断がなければ広がる方法を遍歴する
パラメータ
object:定義されたオブジェクトpropertyname:パラメータ名descriptor:定義された記述情報
descriptor
パラメータのキー
説明
デフォルト
configurable
属性を削除または再定義できますか?
false
enumerable
オブジェクトを巡回するときにアトリビュートが表示されるかどうか
false
value
属性値は、設定後に
undefind
writable
属性が変わるかどうか
get
プロパティを取得するとトリガーされます
undefind
set
プロパティを設定するとトリガーされます
undefind
資料によると
注意:次の設定で例外が放出されます
パラメータ
object:定義されたオブジェクトprops:追加されたプロパティ、
現在のオブジェクトのプロトタイプチェーンオブジェクトを返します .
プロトタイプチェーンは、ほとんどの
js
オブジェクトにプロトタイプチェーンprototype
によって継承された方法または属性があり、java
およびc#
にもデフォルトの継承されたオブジェクトが存在する.js
プロトタイプチェーンによって親にメソッドとプロパティを追加すると、c#
の拡張メソッドのような対応するメソッドとプロパティが生成されます.オブジェクトのプロトタイプチェーンを変更すると、継承された親を変更できます.Object.prototype.test=function(){}
が作成された場合、ほとんどのjs
オブジェクトにtest
のメソッドが存在します.Number.prototype.test=function(){}
が作成された場合、js
のほとんどの数値オブジェクトにはtest
の方法が存在する.String.prototype.test=function(){}
が作成された場合、js
文字列オブジェクトのほとんどにtest
のメソッドが存在する.このうち
__proto__
は必ずしもprototype
に等しいとは限らず、関数のみがprototype
および__proto__
の属性を持ち、対象は__proto__
のみである.各オブジェクトはその内部で1つの属性を初期化します.__proto__
です.オブジェクトの属性にアクセスすると、このオブジェクトの内部にこの属性が存在しない場合、彼は__proto__
に行ってこの属性を探します.この__proto__
には自分の__proto__
があります.そこで、ずっと探しています.継承方法について
prototype
メソッドをインスタンス化することによってオブジェクトを継承するメソッドfunction p(){this.log=function(){}}
function c(){}
c.prototype=new p // p
Object.getPrototypeOf(new c);// c.__proto__
prototype
メソッドをインスタンス化することによって、オブジェクトのprototype
メソッドfunction p(){}
p.prototype.log=function(){}
function c(){}
c.prototype=new p // p
Object.getPrototypeOf(new c);// c.__proto__
prototype
設定prototype
メソッドによりオブジェクトを継承するprototype
メソッドfunction p(){this.logp=function(){}}
p.prototype.log=function(){}
function c(){}
c.prototype=p.prototype // p prototype , logp
c.prototype.test=function(){}
Object.getPrototypeOf(new c);// c.__proto__
__proto__
メソッドによりオブジェクトを継承するメソッドfunction p(){this.logp=function(){}}
p.prototype.log=function(){}
function c(){}
var obj=new c;
obj.__proto__=new p; // p prototype logp
Object.getPrototypeOf(obj);// c.__proto__
this
の役割ドメインを変更することにより親メソッド継承親メソッドを実行する方法function p(){this.logp=function(){}}
p.prototype.log=function(){}
function c(){p.call(this)}
var obj=new c; // logp
プロトタイプチェーン関連メソッド
hasOwnProperty
Array.prototype.log=function(){}
Array.prototype.hasOwnProperty('log') //true
for(key in []){console.log(key)} //log
判断がなければ広がる方法を遍歴する
defineProperty
Object.defineProperty(object, propertyname, descriptor)
パラメータ
object:定義されたオブジェクトpropertyname:パラメータ名descriptor:定義された記述情報
descriptor
パラメータのキー
説明
デフォルト
configurable
属性を削除または再定義できますか?
false
enumerable
オブジェクトを巡回するときにアトリビュートが表示されるかどうか
false
value
属性値は、設定後に
get
とset
を設定できません.undefind
writable
属性が変わるかどうか
get
プロパティを取得するとトリガーされます
undefind
set
プロパティを設定するとトリガーされます
undefind
資料によると
writable
のデフォルト値はfalse
であるが、このパラメータを設定しない場合、value
は変更可能であり、懐疑的な態度をとり、解くことができる. var user={};
Object.defineProperty(user, 'name', {
get:()=>{
console.log(`get value:${this.name}`)
return this.name;
},
set:value=>{
console.log(`set value:${value}`)
this.name=value;
}
});
注意:次の設定で例外が放出されます
var user={};
Object.defineProperty(user, 'name', {
value:'johe',
get:()=>{
console.log(`get value:${this.name}`)
return this.name;
},
set:value=>{
console.log(`set value:${value}`)
this.name=value;
}
});
//Uncaught TypeError: Invalid property descriptor.
//Cannot both specify accessors and a value or writable attribute, #
defineProperties
Object.defineProperties(object, props)
パラメータ
object:定義されたオブジェクトprops:追加されたプロパティ、
key
およびvalue
のそれぞれObject.defineProperty
の2番目および3番目のパラメータ.getPrototypeOf
Object.getPrototypeOf("test") //String {length: 0, [[PrimitiveValue]]: ""}
現在のオブジェクトのプロトタイプチェーンオブジェクトを返します
__proto__
とprototype
の違い__proto__
がprototype
と等しいとき function c(){}
c==c.prototype.constructor //true
c==(new c).constructor //true
(new c).__proto__===c.prototype //true
(new c).__proto__
とc.prototype
,(new c).constructor.prototype
はいずれも恒等である.prototype
に属性とメソッドが付与されると、関数によって作成されたインスタンスはprototype
の属性とメソッドを継承します.__proto__
とprototype
が等しくないとき function c(){}
c.prototype={
log:function(){}
}
c==c.prototype.constructor //false
c==(new c).constructor //false
(new c).__proto__===c.prototype //true
(new c).constructor===Object //true;
c.prototype
を書き換えた後も、(new c).__proto__
とc.prototype
は一定であったが、c.prototype.constructor
はObject
ではなくc
を指した.