js经典试题之原型与继承
1:以下代码中hasOwnProperty的作用是?
var obj={}
……..
obj.hasOwnProperty("val")
答案:判断obj对象是否具有val属性
解析:
hasOwnProperty: 是用来判断一个对象是否有你给出名称的属性或对象。不过需要注意的是,此方法无法检查该对象的原型链中是否具有该属性,该属性必须是对象本身的一个成员。
isPrototypeOf : 是用来判断要检查其原型链的对象是否存在于指定对象实例中,是则返回true,否则返回false。
hasPrototypeProperty:只有当该属性只存在于原型上时才会返回true
2:能改变作用域链的方式?
答案: with try-catch eval
解析:
with 语句用于设置代码在特定对象中的作用域
try/catch/finally 语句用于处理代码中可能出现的错误信息
eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码
3:程序的输出是什么?
var myObject = {
foo: "bar",
func: function() {
var self = this;
console.log(this.foo);
console.log(self.foo);
(function() {
console.log(this.foo);
console.log(self.foo);
}());
}
};
myObject.func();
答案:bar bar undefined bar
解析:
理解关键:方法/函数是由谁(对象) 调用 的,方法/函数内部的 this 就指向谁(该对象);
注意:被谁调用,不是处于谁的作用域,即使在作用域
1.第一个this.foo输出bar,因为当前this指向对象myObject。
2.第二个self.foo输出bar,因为self是this的副本,同指向myObject对象。
3.第三个this.foo输出undefined,因为这个IIFE(立即执行函数表达式)中的this指向window。
4.第四个self.foo输出bar,因为这个匿名函数所处的上下文中没有self,所以通过作用域链向上查找,从包含它的父函数中找到了指向myObject对象的self。
4:程序的输出是什么?
var obj ={a:1,b:function () {alert(this.a)}};
var fun =obj.b;
fun();
答案:弹出undefined
解析:
this的行为有时候会显得极其诡异,让人感到困惑,但只需要记住 this的值要等到代码真正执行时才能确定
同时this的值具体有以下几种情况:
new 调用时指的是被构造的对象
call、apply调用,指向我们指定的对象
对象调用,如执行obj.b(),this指向obj
默认的,指向全局变量window(相当于执行window.fun())
这样看来,当你执行fun()的时候,以上1,2点均不满足。
第3点,因为this是运行时确定的,而我们执行fun(),等同于windown.fun()(与obj没有任何关系),自然的this指向window,而window没有定义变量a,结果是undefined。
上面的例子我们可以作如下修改:
var a = 1
var obj ={
a: 11,
b:function () {
console.log(this.a)
}
};
obj.b() // 11
var fun =obj.b;
fun(); // 1