普通调用函数,若函数没有return语句,等于return undefined,
构造函数调用的时候,1创建一个新对象,2将构造函数的作用域赋给新对象(this赋给了这个新对象),3执行构造函数中的代码(为这个新对象添加属性),4返回新对象
function A(){
//1这一步是看不到的,创建一个新对象;
var a = {};
//2第二步赋给新对象。
this = a;
//3执行
alert(this);
//4返回新对象
return this;
}
A.prototype.a = 1;
console.log(new A().a);
function A() { alert(this); return {a: 'a'}; } A.prototype.a = 1; console.log(new A().a);
new A()与原型没关系,因为返回的不是this,是自己返回的对象的属性a;
,
function Human() { } Human.prototype.address = { country: 'China', province: 'Zhejiang' }; var h = new Human(); h.address.country = 'US'; alert(h.address.country); //US,实例覆盖了原型,在实例上 alert(h.address.province); //Zhejiang,原型上 alert(h.hasOwnProperty('address')); //false
h.address = { country: 'US' }; delete h.address.country; delete h.address; alert(h.address.country); //US,实例覆盖了原型,在实例上 alert(h.address.province); //Zhejiang,原型上 alert(h.hasOwnProperty('address')); //false
function Human() { } Human.prototype.address = { country: 'China', province: 'Zhejiang' }; var h = new Human(); Human.prototype = { address: { a: 'aaa' } }; var h2 = new Human(); alert(h.address.country); //China alert(h.address.province); //Zhejiang alert(h.address.a); //undefined alert(h2.address.country); //undefined alert(h2.address.province); //undefined alert(h2.address.a); //aaa
function test(h1) { h1 = {}; h1.address = { a: 'aaa' }; // address.a = 'bbb'; } test(h); alert(h.address.country); //China alert(h.address.province); //Zhejiang alert(h.address.a); //undefined
var a = 'a'; function test(a) { alert(a); //a a = 'b'; alert(a); //b test2(a); } function test2(b) { // var a; alert(b); //b alert(a); //b // a = 'c'; alert(a); //c } test(a);
var getName; function getName() { return 5; } function Foo() { getName = function () { return 1; }; return this; } Foo.getName = function () { return 2; }; Foo.prototype.getName = function () { }; getName = function () { return 4; }; //请写出以下输出结果: console.log(Foo.getName()); console.log(getName()); console.log(Foo().getName()); console.log(getName()); console.log(new Foo.getName()); console.log(new Foo().getName()); var f = new new Foo().getName(); alert(f);