js 攻坚克难
new
new : 官方解释: 如果在一个函数前面带上new来调用,那么背地里将会创建一个连接到该函数的prototype的成员的新对象,同时this会被绑定到哪个新对象上;
new 是用来创建对象的;
当在自定义的function类型前使用new时,只有当函数无返回时才有区别;
当无返回值时:使用new可以获得对象,不使用new就是执行一个普通的函数;
当有返回值时:使用new与否结果都是一样的。
prototype 与 __proto__
只有类型才有prototype; 比如 Object ,Function,Boolean以及自定义的function
对象才会有__proto__;并且对象的__proto__执行类型的prototype;
Math有__proto__但是没有prototype,因为它是对象,但不是类型。
var Quo = function (str){ this.status = str; } //只有类型才能访问到prototype Quo.prototype.getStatus = function (){ return this.status; }; var myQuo2 = new Quo("c222"); var myQuo = new Quo("confused"); //对象的__proto__执行类型的prototype myQuo.__proto__.gstatus = function (){ alert(2222); } alert(myQuo.getStatus()); myQuo.gstatus(); //原型被人改变了 myQuo2.gstatus();
模块模式 与原型链模式
原型链模式是将方法添加到原型上面,模块模式是使用闭包将模拟class的格式;
/*模块模式*/ var obj = function (){ this.name = "wch"; function getName(){return name;}; function setName(n){name = n;}; return {getName:getName,setName:setName} }; /*原型链模式*/ var Quo = function (str){ this.status = str; } Quo.prototype.getStatus = function (){ return this.status; }; var myQuo = new Quo("confused"); alert(myQuo.getStatus());