在我們的遊戲需求裡,可能會需要做一類操作,判斷某個節點是否有某一類javascript腳本,然後進行執行相應的功能函數。
一、用javascript自帶的一種判斷方法
這種方法在任何javascript代碼裡都可以使用:
instanceof運算符
如果是普通的javascript代碼,則示例如下:
function Cat(name){
Animal.call(this);
this.name = name || 'Tom';
}
(function(){
// 建立一個沒有執行個體方法的類
var Super = function(){};
Super.prototype = Animal.prototype;
//将執行個體作為子類的原型
Cat.prototype = new Super();
})();
// Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.sleep());
console.log(cat instanceof Animal); // true
console.log(cat instanceof Cat); //true
如果是CocosCreator的代碼,則:
var ComponentBase = require("ComponentBase");
cc.Class({
extends: ComponentBase,
properties: {
},
start () {
console.log("111111", this instanceof ComponentBase);
},
});
二、這個是CocosCreator獨有的,就是用getComponent("父類腳本名")
首先看我們的示例代碼:
ComponentBase.js:
cc.Class({
extends: cc.Component,
properties: {
},
onCallback: function (params) {
console.log("vvv");
},
});
ComponentDerived1.js:
var ComponentBase = require("ComponentBase");
cc.Class({
extends: ComponentBase,
properties: {
},
start () {
console.log("111111", this instanceof ComponentBase);
console.log(this.getComponent("ComponentBase"));
},
onCallback: function (params) {
console.log("vvv1", "test1");
},
});
ComponentDrived2.js:
var ComponentBase = require("ComponentBase");
cc.Class({
extends: ComponentBase,
properties: {
},
start () {
console.log("2222", this instanceof ComponentBase);
console.log(this.getComponent("ComponentBase"));
},
onCallback: function (params) {
console.log("vvv2", "test2");
},
});
最後一個,判斷是否繼承了自定義類ComponentBase的ComponentManager.js:
cc.Class({
extends: cc.Component,
properties: {
},
start () {
var test = this.getComponents("ComponentBase")
console.log(test);
for(var key in test) {
test[key].onCallback();
}
},
});
再如下圖綁定腳本:
運作,會在console上看到:
經過這一翻折騰之後,可以看出,我們的getComponents不隻可以擷取有相應檔案名的腳本,還可以通過擷取父類的檔案名,擷取到自己的腳本。
這樣的話,就可以通過擷取父類的主檔案名來擷取腳本,進而達到判斷腳本是否具有某一類功能的目的。
最後,有一個小tips:
想一想,如果我們是getComponents("cc.Component"),這樣就能直接擷取該節點下的所有腳本啦。。