JavaScript进阶试题

1.选出以下几个中为true的选项

null instanceof Object
null === undefined
null == undefined
NaN == NaN
null === null

2. 写出下题的输出结果

 1 function Person(name, age) {
 2             this.Name = '为负值';
 3             this.Age = '为负值';
 4             (function () {
 5                 this.Name = name;
 6                 this.Age = age;
 7             }).call(this);
 8             this.sayHello = function () {
 9                 alert('this.name,hello:' + this.Name);
10                 alert('window.name,hello:' + window.Name);
11             };
12         }
13         var p = new Person('sunny', '18');
14         p.sayHello();

3.写出下题的输出结果

1  var a = 10;
2  sayHi();
3  function sayHi() {
4      var a = 20;
5      alert(a);
6  }
7  alert(a);

4. 写出下题的输出结果

 1 function foo() {
 2     foo.abc = function () { alert('def'); };
 3     abc = function () { alert('@@@@'); };
 4     var abc = function () { alert('$$$$$'); };
 5 }
 6 foo.prototype.abc = function () { alert('456'); };
 7 foo.abc = function () { alert('123'); };
 8 var f = new foo();
 9 f.abc();
10 foo.abc();
11 abc();

附:答案

1. false, false, true, false, true

2. this.name,hello:sunny

    window.name,hello:undefined

3.20, 10

4. alert('456'); alert('def');  最后一个abc() 方法可能会报错!  

   这个不知道多少人会错

 附:

 1. instanceof 

  为判断一个对象是否为某一数据类型,或一个变量是否为一个对象的实例;返回boolean类型
  语法为 o instanceof A

  实例: a instanceof b?alert("true"):alert("false"); //a是b的实例?真:假

 2. call

  语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]])
  定义:调用一个对象的一个方法,以另一个对象替换当前对象。
  说明:
  call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由thisObj 指定的新对象。
  如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

  简单的可以理解为

   a.call(b); a.method.call(b,argument1,argument2);

   简单实例: 

 1 function add(a,b) 
 2 { 
 3     alert(a+b); 
 4 } 
 5 function sub(a,b) 
 6 { 
 7     alert(a-b); 
 8 } 
 9 
10 add.call(sub,3,1); 

 这个例子中的意思就是用 add 来替换 sub,add.call(sub,3,1) == add(3,1) ,所以运行结果为:alert(4);

  注意:js 中的函数其实是对象,函数名是对 Function 对象的引用。 

 稍微复杂点的实例:

 1 function Class1() 
 2 { 
 3     this.name = "class1"; 
 4 
 5     this.showNam = function() 
 6     { 
 7         alert(this.name); 
 8     } 
 9 } 
10 
11 function Class2() 
12 { 
13     this.name = "class2"; 
14 } 
15 
16 var c1 = new Class1(); 
17 var c2 = new Class2(); 
18 
19 c1.showNam.call(c2); 

  注意,call 的意思是把 c1 的方法放到c2上执行,原来c2是没有showNam() 方法,

  现在是把c1 的showNam()方法放到 c2 上来执行,所以this.name 应该是 class2,

  执行的结果就是 :alert("class2");
 

 实现继承的实例: 

 1 function Class1() 
 2 { 
 3     this.showTxt = function(txt) 
 4     { 
 5         alert(txt); 
 6     } 
 7 } 
 8 
 9 function Class2() 
10 { 
11     Class1.call(this); 
12 } 
13 
14 var c2 = new Class2(); 
15 
16 c2.showTxt("cc"); 

  这样 Class2 就继承Class1了,Class1.call(this) 的 意思就是使用 Class1 对象代替this对象,

  那么 Class2 中不就有Class1 的所有属性和方法了吗,c2 对象就能够直接调用Class1 的方法以及属性了,

  执行结果就是:alert(“cc”); 
  多重继承: 

 1 function Class10() 
 2 { 
 3     this.showSub = function(a,b) 
 4     { 
 5         alert(a-b); 
 6     } 
 7 } 
 8 
 9 function Class11() 
10 { 
11     this.showAdd = function(a,b) 
12     { 
13         alert(a+b); 
14     } 
15 } 
16 
17 
18 function Class2() 
19 { 
20     Class10.call(this); 
21     Class11.call(this); 
22 } 

  ok 就介绍到这里了。关于call的方法参考sweting的博文 js call

 

posted @ 2015-02-06 13:40  flyfishing  阅读(283)  评论(0编辑  收藏  举报