js原型和原型链笔试题
1、如何准确判断一个变量是数组类型?
var arr = [];
console.log(arr instanceof Array); //true
console.log(typeof arr); //object 无法判断是否是数组
instanceof 具体用法可以翻看我的另一篇博客JS中的instanceof运算符
2、写一个原型链继承的例子
//动物
function Animal() {
this.eat = function () {
console.log('animal to eat!')
}
}
//狗
function Dog() {
this.call = function () {
console.log('dog call!')
}
}
Dog.prototype = new Animal();
//秋田
var qiutian = new Dog()
qiutian.call(); //dog call!
qiutian.eat();//animal to eat!
可以看出qiutian是Dog的实例化对象,qiutian继承了Dog的方法call()这一点是没有疑问的,但是为什么qiutian依然能正常使用eat()方法呢?这是因为我们把Dog的原型对象指向了Animal,从而继承了Animal的方法eat(),当qiutian使用eat()方法时,它本身是没有这个属性的,但它会顺着__proto__去它的原型对象找,显然Dog也没有,它会继续顺着Dog的原型对象找到Animal,发现Animal有这个属性从而继承它。
3、描述new一个对象的过程
function Person(name,age) {
this.name = name
this.age = age
this.class = 'class-1'
//return this //默认有这一行
}
var person = new Person('Andy',13);
- 创建一个新对象
var person = new Person('Andy',13) 将参数传进去,函数中的 this 会变成空对象
- this 指向这个新对象
this.name = name;this.age = age;this.class = 'class-1' 为赋值;return this 为实际的运行机制
- 执行代码,即对 this 赋值
return 之后赋值给 person ,person具备了 person.name = Andy、person.age = 13、f.class = 'class-1'
- 返回this
4、原型链
//构造函数
function Person(name) {
this.name = name
}
Person.prototype.sayName = function () {
alert(this.name)
}
//实例化对象
var p = new Person('Andy');
p.printName = function () {
console.log(this.name)
}
//测试
p.printName();
p.sayName();
p.toString();//null
p.toString(),当这个对象没有这个属性的时候,去它自身的隐式原型中找,它自身的隐式原型就是它构造函数(Person)的显式原型(Person.prototype)但显式原型(Person.prototype)中并没有 toString ;但显式原型(Person.prototype)也是对象,也要在它的隐式原型中找,即在其构造函数 (Object )的显式原型中去找 toString. 故要在 p._proto_(隐式原型)的._proto_(隐式原型)中找,为null