function Foo() {
Foo.a = function () {console.log(1)};
this.a = function () {console.log(2)};
a = function () {console.log (3)};
var a = function () {console.log (4)};
}
// 以上只是 Foo 的构建方法,没有产生实例,此刻也没有执行
Foo.prototype.a = function () {console.log(5)};
// 现在在 Foo 上挂载了原型方法 a ,方法输出值为 5
Foo.a = function () {console.log(6)};
// 现在在 Foo 上挂载了直接方法 a ,输出值为 6
Foo.a(); // 6
// Foo.a() 这个是调用 Foo 函数的静态方法 a,虽然 Foo 中有优先级更高的属性方法 a,
但 Foo 此时没有被调用,所以输出 Foo 的静态方法 a 结果:6。如果前面有foo(),则是1
var obj = new Foo();
/*使用了 new 方法调用了函数,返回了函数实例对象,此时 Foo 函数内部的属性方法初始化,原型链建立。
Foo 的构建方法主要做了两件事:
1. 将全局的 Foo 上的直接方法 a 替换为一个输出 1 的方法。
2. 在新对象上挂载直接方法 a ,输出值为 2。
*/
obj.a(); // 2
//调用 obj 实例上的方法 a,该实例上目前有两个 a 方法:一个是内部属性方法,另一个是原型上的方法。
当这两者都存在时,首先查找Foo ,如果没有才去原型链上找,所以调用实例上的 a 输出:2
Foo.a();// 1
// foo.a() ; 根据第2步可知 foo 函数内部的属性方法已初始化,构建方法里已经替换了全局 Foo 上的 a 方法。
总结:考察的是优先级问题: 首先在自己内部查找对应的属性和方法,找到就结束;如果自己内部找不到,就在原型上面找,找到就结束;如果原型上找不到,就继续沿着原型的原型往上找,直到找到为止;如果整个原型链上都找不到需要的属性则返回undefined;如果整个原型链上找不到调用的方法,则提示函数不存在,代码报错;
同类型:
填写内容让下面代码支持a.name = “ name1 ” ; b.name = “ name2
function obj(name) {
1
}
obj. 2 = "name2";
var a = obj("name1");
var b = new obj ();
答案:
1:if (name) {this.name = name;} return this;
2:prototype.name