2014-04-09 93 views
1

如何通過名稱空間獲取實例化對象的類型名稱?如何在JavaScript中獲取此對象的類型名稱?

考慮宣佈的傳承的這兩種方式:

模塊

通過這種方式之外,還有名爲Shark一個function對象,因此每當我問myShark.constructor.name,它返回名稱constructor引用的功能,即Shark

// Fish 
function Fish() { 
    this.fins; 
} 
Fish.prototype.swim = function() { 
    console.log("Swim"); 
}; 

// Shark 
function Shark() { 
    this.teeth; 
} 
Shark.prototype = new Fish; 
Shark.prototype.constructor = Shark; 

var myShark = new Shark(); 
console.log("My shark is: " + myShark.constructor.name); 
// Prints => My shark is: Shark 

裏面一個模塊

這是所有罰款,但每當我宣佈一個模塊內部的繼承結構,我通常如下構建它。問題在於Yacht的構造函數引用了一個匿名函數。因此,每當我要求myBoat.constructor.name它有一個空字符串。有沒有辦法讓我仍然可以獲得對象類型的String表示形式?

var boats = (function() { 
    exports = {}; 

    // Boat 
    exports.Boat = function() { 
     this.crew = 1; 
    }; 
    exports.Boat.prototype.sail = function() { 
     console.log("Sail"); 
    }; 

    // Yacht 
    exports.Yacht = function() { 
     this.decks = 4; 
    }; 
    exports.Yacht.prototype = new exports.Boat; 
    exports.Yacht.prototype.constructor = exports.Yacht; 

    return exports; 
}()); 

var myYacht = new boats.Yacht(); 
console.log("My boat is: " + myYacht.constructor.name); 
// Prints => My boat is: 

我已經考慮改變我如何聲明繼承,以便創建一個名爲模塊內部的功能,然後通過exports暴露它們如下。有沒有其他方法可以得到相同的結果而不需要必須作出命名的功能,然後將它們附加到出口?

var drinks = (function() { 
    var exports = {}; 

    // Drink 
    function Drink() { 
     this.calories = 130; 
    } 

    // Beer 
    function Beer() { 
     this.alcohol = 8; 
    } 
    Beer.prototype = new Drink; 
    Beer.prototype.constructor = Beer; 

    exports.Drink = Drink; 
    exports.Beer = Beer; 

    return exports; 
}()); 

var myBeer = new drinks.Beer(); 
console.log("My drink is: " + myBeer.constructor.name); 
// Prints => My drink is: Beer 

回答

1

另一種方法是使用函數表達式的名稱:

// Yacht 
exports.Yacht = function Yacht() { 
    this.decks = 4; 
}; 
exports.Yacht.prototype = new exports.Boat; 
exports.Yacht.prototype.constructor = exports.Yacht; 
// incorrect: exports.Yacht.prototype.constructor = Yacht 
// as the name is not in the scope 

// ... 
var myYacht = new boats.Yacht(); 
console.log("My boat is: " + myYacht.constructor.name); 
// My boat is: Yacht 

注意添加名字到功能將不會引入Yacht進入主功能的範圍,所以它不一樣的功能在第三個代碼片段中使用的聲明方法。此外,它更簡潔。 )

+0

當你說「主要功能的作用域」時,你的意思是命名空間/模塊的權利?這樣做有沒有其他副作用?如果沒有,我可能會採取這條路線。 – zero298

+0

是的,模塊功能;沒有我知道的。 ) – raina77ow