JSコンストラクタがオブジェクトを作成する際の参照問題

1839 ワード

オブジェクトの属性が文字列の場合
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"
    }
});
このようにすると、オブジェクトの属性値を対象としたパラメータ問題が解決されます.