js经典试题之原型与继承

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的值具体有以下几种情况:

  1. new 调用时指的是被构造的对象

  2. call、apply调用,指向我们指定的对象

  3. 对象调用,如执行obj.b(),this指向obj

  4. 默认的,指向全局变量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

  

 
原文地址:https://www.cnblogs.com/momozjm/p/7760568.html