---使用new运算符调用一个函数时,总是返回一个对象
1、当使用new调用任何函数时,它会发生如下事情:
2、后台自动创建一个“空”对象,通过this引用该对象;var this={};//伪代码
3、可任意给this添加属性
4、在函数的末尾隐式返回this
但也可以通过下面的步骤返回不同的不同对象:
function Dog(){ var oDog=new Dog();
var noThis={noname:"Any"}; oDog.name; //undefined
this.name="Fod"; oDog.noname.name;//Any 返回定制的对象(不是this)
return noThis;//覆盖了
}
当使用new的时候,可以返回一个定制的对象(不是this),如果返回一个非对象(标量值),将会导致返回值被忽略,最终仍会得到this。例如:
function Dog(){ var oDog=new Dog();
this.name="Fod"; oDog.name; //Fod
return 1;
}
当引用一个构造函数的时候,可能会忘记加上new 我们可以通过这个函数以构造函数的方式返回
function Dog(){
if(!(this instance Dog)){
return new Dog();
}
}
----//直接字面量继承另外一个直接字面量的属性
function extend(parent){
var child={};
for(var name in paret){
if(parent.hasOwnProperty(naem)){
child[name]=parent[name];
}
}
return child;
}
//临时构造函数
function extend(obj){
var F=function(){};
F.prototype=o;
return new F();
}
function extend(parents,child){
var F=function(){};
F.prototype=parent.prototype;
child.prototype=new F();
child.prototype.constructor=child;
}
----借用构造函数的时候,新对象会得到父对象中的tags成员:
function Parent(){
this.name=["CSS","JS"];
}
Parent.prototype.sayName=function(){console.log(this.name)};
var oParent=new Parent();
function Child1(){};
child.prototype=oParent;
var oChild1=new Child1();
oChild1.sayName();
function Child2(){ //不能继承原型上的属性或方法
Parent.call(this);
}
var oChild2=new Child2();
oChild2.sayName(); //Uncaught TypeError: oChild2.sayName is not a function(…)
console.log(oChild1.hasOwnProperty("name")); //false
console.log(oChild2.hasOwnProperty("name")); //true
oChild1.name.push("php");
oChild2.name.push("Java"); //只是一个副本,不能往上级的属性中添加值
console.log(oParent.name); //["CSS","JS","php"]
------借用和设置原型,父对象的本身属性和原型属性都能得到
function Child(){
Parent.apply(this,arguments);
}
Child.prototype=new Parent();
var oChild=new Child();
oChild.sayName();
function Child(name){ Parent.call(this,name); }
function Child(name){ Parent.call(this,name); } Child.prototype=new Parent();
function object(o){ var F=function(){}; F.prototype=o; return new F(); }
function createAnother(origin){ var F=function(){}; F.prototype=o; var clone=new F(); clone.addfn=function(){};//被添加的函数不能复用,效率较低。 }
var Sub=function(){ Sup.call(this); } function extend(Child,parent){ var F=function(){}; F.prototype=Parent.prototype; Child.prototype=new F(); }