Skip to main content

JS 继承

题目 1

        function createPerson(name, age, job) {
var o = new Object()
o.name = name;
o.age = age;
o.job = job;
o.sayNmae = function () {
console.log(this.name);
};
return o;
}
var person1 = createPerson('Ryan', 29, 'teacher');

console.log(person1 instanceof createPerson)

问:输出的结果是什么

答案

打印出来false

理由

先看一个案例:

        function createPerson1(name, age, job) {
var o = new Object()
o.name = name;
o.age = age;
o.job = job;
o.sayNmae = function () {
console.log(this.name);
};
return o;
}

function createPerson2(name, age, job) {
var o = new Object()
o.name = name;
o.age = age;
o.job = job;
o.sayNmae = function () {
console.log(this.name);
};
}

var person1 = createPerson1('Ryan', 29, 'teacher');
var person2 = new createPerson2('Ryan', 29, 'teacher');

console.log(person1) //返回对象O
console.log(person1 instanceof Object) //true,因为对象O就是一个Object
console.log(person1 instanceof createPerson1) //false,因为person1不是他的实例

console.log(person2 instanceof createPerson2) //true

官方的解释如下:

instanceof运算符用于检测构造函数的prototype属性是否出现在某个实例对象的原型链上

return 是把O返回给person1O本身就是一个对象,所以person1 instanceof Object 是 true,并且person1.__proto__ === Object.prototype是为 true

因为person1的原型链上没有createPerson ,所以person1 instanceof createPerson 是 false

createPerson是一个函数,返回的O是一个是一个对象,person1相当于调用这个函数的意思,所以返回的是对象O而不是对象的实例,所以返回的是 false

如果是person2 instanceof createPerson2的话,这个结果就为 true,因为 new 实例化出来的对象就是属于createPerson2

如果person2有一个return O的话,那么结果就会跟person1一样,无论是否有 new,如下结果

        function createPerson(name, age, job) {
var O = new Object()
O.name = name;
O.age = age;
O.job = job;
O.sayNmae = function () {
console.log(this.name);
};
return O;
}
var person1 = new createPerson('Ryan', 29, 'teacher');
var person2 = createPerson('Ryan', 29, 'teacher');

console.log(person1) //返回对象O
console.log(person2) //返回对象O

因为返回的是对象O,那么new O是没有作用的