JSコンストラクタがオブジェクトを作成する際の参照問題
1839 ワード
オブジェクトの属性が文字列の場合
ただし、オブジェクトが属性値のオブジェクトである場合
javascriptはグローバルスコープで定義された関数で、Globalオブジェクトに定義されています.グローバルスコープでは一般関数を呼び出し、thisはGlobalオブジェクト(windowオブジェクト)を指します.ここでは構造関数と言いますが、newオペレータを使用していない場合、User(boj)は普通関数です.だから、グローバルスコープでnewオペレータを通じて呼び出さないと、this.nameはwindow.nameです.
function User(obj){
this.name = obj.name;
this.password = obj.password;
}
var user = new User({
name:"name",
password:"password"
});
window.onload = function(){
console.log(user);
}
オブジェクトをコンストラクタで参照して新規作成し、正確に出力することができます.ただし、オブジェクトが属性値のオブジェクトである場合
function User(obj){
this.loginInfos.name = obj.loginInfos.name;
this.loginInfos.password = obj.loginInfos.password;
}
var user = new User({
loginInfos:{
name:"name",
password:"password"
}
});
window.onload = function(){
console.log(user);
}
「Can not find property'name'of undfined」と表示されますが、this.logine Infosという属性が見つけられませんでした.これは構造関数User(obj)にlogiinfosという属性が定義されていないので、logine Infos.nameが見つけられないのです.javascriptはグローバルスコープで定義された関数で、Globalオブジェクトに定義されています.グローバルスコープでは一般関数を呼び出し、thisはGlobalオブジェクト(windowオブジェクト)を指します.ここでは構造関数と言いますが、newオペレータを使用していない場合、User(boj)は普通関数です.だから、グローバルスコープでnewオペレータを通じて呼び出さないと、this.nameはwindow.nameです.
function User(obj){
this.name = obj.name;
this.password = obj.password;
}
User({name:"name",password:"password"});
window.onload = function(){
console.log(window.name);//name
console.log(window.password);//password
}
newオペレータによってオブジェクトを作成するには、次の4つのステップがあります.1.新しいオブジェクトを作成します.2.構造関数の作用領域を新しいオブジェクトに割り当てます.3.構造関数のコードを実行します.4.新しいオブジェクトを返します.だから、構造関数の参照によって属性値のオブジェクトを作成します.構造関数で属性値をオブジェクトとして定義することができます.次のようにできます.function User(obj){
this.loginInfos = {};
this.loginInfos.name = obj.loginInfos.name;
this.loginInfos.password = obj.loginInfos.password;
}
var user = new User({
loginInfos:{
name:"name",
password:"password"
}
});
このようにすると、オブジェクトの属性値を対象としたパラメータ問題が解決されます.