拿正在学习的例子阐述下问题。
// 鸭子类型
var duck = {
duckSinging: function () {
console.log('gagaga');
}
};
var chicken = {
duckSinging: function () {
console.log('gagaga');
}
};
var arr = [];
var checkDuck = function (animal) {
if (animal && typeof animal.duckSinging === 'function') {
arr.push(animal);
console.log('新成员:' + ??????); // 此处想要的效果:新成员:chicken
};
};
checkDuck(duck);
checkDuck(chicken);
Duck.prototype.constructor,他的原型对象里面的constructor指向的是duck,他的值是个字符串,可随意更改的,试下能否获取
你跑一下这个试试看,看是不是你想要的效果。
var duck = {
name: 'duck',
duckSinging: function () {
console.log('gagaga');
}
};
var chicken = {
name: 'chicken',
duckSinging: function () {
console.log('jijiji');
}
};
var arr = [];
var checkDuck = function (animal) {
if (animal && typeof animal.duckSinging === 'function') {
arr.push(animal);
console.log('新成员:' + animal.name); // 此处想要的效果:新成员:chicken
}
};
checkDuck(duck);
checkDuck(chicken);
对象是没有名字的。你想拿的是变量名,这种方法是不存在的,因为几个变量可以指向同一个对象,如果存在这种方法的话应该返回哪个变量名呢。
比较好的处理方法是在对象中设置一个属性用来保存名称
{
name: 'chicken',
...
}
然后通过animal.name
访问对象名就可以了
如果你的代码是在全局作用域下运行的,
nodejs下global
,浏览器下为window
那么可以这样如下代码所示,否则就不可以~~
var duck = {
duckSinging: function () {
console.log('gagaga');
}
};
var chicken = {
duckSinging: function () {
console.log('gagaga');
}
};
var arr = [];
var checkDuck = function (animal) {
for(var prop in global){
if(global[prop]===animal){
console.log('新成员:' + prop); }
}
};
checkDuck(duck);
checkDuck(chicken);