var Foo = {
name: "Foo"
};
Foo.method = function () {
function test() {
//直接调用函数时,this 指向全局对象。不管函数定义在什么地方,在什么地方调用。
//被认为是JavaScript语言另一个错误设计的地方,因为它从来就没有实际的用途。
//这里不能和var对比理解,var也不是给当前对象添加属性,而是给函数作用域。
console.log(this.toString());
}
test();
}
Foo.method();
Foo.method2 = function () {
var that = this;
function test() {
console.log(that);
// 使用 that 来指向 Foo 对象
}
test();
}
Foo.method2();
function Foo1111() {
name: "Foo1111"
}
Foo1111.prototype.method = function () {
console.log("this name in : "+ this.name);
};
function Bar() {
this.name ="Bar"
}
console.log("Bar.prototype.constructor is :" + Bar.prototype.constructor);
Bar.prototype = Foo1111.prototype;
console.log("Bar.prototype = Foo1111.prototype 以后,Bar.prototype.constructor is :" + Bar.prototype.constructor);
new Bar().method();
//new Bar()可以直接调用生成的对象。
(new Bar()).method();
Function.prototype.add=function(name,fn){
this.prototype[name]=fn;
return this;
}
var Methods=function(){
this.addObj = function () { console.log("my is add to obj") }
};
Methods.add('a', function () { console.log("a") }).add('b', function () { console.log("b")})
console.log(Methods)
console.log(Methods.prototype)
var che=new Methods();
che.addObj()//"my is add to obj"
che.a()//b
console.log(che.constructor)
console.log(che.constructor == Methods)//true
var a = 2
function foo(){
console.log(this.a)
}
var obj = {
a:1,
f:foo,
}
obj.f()// 1, this指向obj
foo()//2,this指向全局window
//箭头函数,this在声明时指向window,在调用时指向声明时所在的上下文this
var a = 2
var obj = {
a:1,
f: ()=>{console.log(this.a) },
f1: function(){
(()=>{console.log(this.a)})() }
}
obj.f()// 2, this指向window
obj.f1()// 1, this指向外层的上下文
var obj2 = {
a:1,
f: function foo(){
console.log(this.a)
},
}
var newObj2={
a:2
}
//取决于函数的调用方;而非定义区域
newObj2.f = obj2.f
obj2.f() // 1
newObj2.f() //2
console