JS高级程序设计中的工厂模式
function createPerson(name,age,job){
var o=new Object();
o.name=name;
o.age=age;
o.job=job;
o.sayName=function(){
alert(this.name);
};
return o;
}
var person1=createPerson("Nicholas",29,"software Engineer");
var person2=createPerson("Greg",27,"Doctor");
在这里,如果console.log(person1);编会打印出来person1,这没有问题。
下面来看一下构造函数模式。
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayName=function(){
alert(this.name);
};
}
var person1=new Person("Nicholas",29,"software Engineer");
var person2=new Person("Greg",27,"Doctor");
下面我的问题来了,在构造函数模式中,使用了this,它指向了引用它的新对象也就是person1和person2;
我困惑的是,如果把工厂模式中的为属性赋值时用的o换成this为什么不可以?调用createPerson时返回的return o不也指向了新对象person1吗?此时this.name等不也是设置person1的name属性吗?但是我在使用了this之后,在控制台再次用console.log(person1),却打印出了一个空对象。有哪位大神帮我解答一下吗?
函数的调用方式不一样,this 指向的值也是不一样的,
函数 createPerson 是常规调用方式,this 指向的是全局对象,在浏览器环境中就是 window
函数 Person 是构造函数方式调用,this 指向的是生成的那个对象
你可以在两个函数中 console.log(this) 查看,便知
this在浏览器下,谁调用就是谁,没人调用就是window。
var person1=createPerson("Nicholas",29,"software Engineer");
var person1=new Person("Nicholas",29,"software Engineer");
区别在这两句话中,你可以看到第一个语句里面没有new关键字,直接执行一个函数;而第二个表达式中有new,也就是说是新实例化了一个对象。
JS中关于this的定义是:函数直接在全局中执行,那么this指向的是全局对象window。也就是说你在createPerson中new了一个o,但是你再执行this.name=name那么就等于是执行了window.name=name,o对象本身不会有任何印象,最后你return了o也只是得到了一个空对象。
而JS中执行了new之后,等于通过构造函数创建了一个新对象,那么这个构造函数中的this也就指向了这个新实例化的对象,此时this.name=name修改了新对象person1中的name值。
关于对象实例化的知识和this指向的问题题主还多翻一翻博客园的文章,讲的很详细,从长久发展来看先打好基础对你以后的道路更有好处。
望采纳。
首先更正一下,这里不是this的问题而是一个返回值的问题,我不知道你所谓的工厂模式指的是什么,如果有什么含义可以沟通一下。
正题:
你第一个构造函数里面带有了返回值o,并且对其赋值了,而第二个你只是对函数属性赋值了,且没有任何返回值,一个函数在没有返回值的情况下的默认返回值是undefined。其实不管是person1、person2
var 任何变量=new Person(参数);//所存储的值都只是new Person(参数)的返回值而已。
当然你的new Person(参数)和Person(参数)是同一个意思。
************************************************希望对你有用。
this四种绑定方式1.默认绑定;2.隐式绑定;3.显示绑定;4.new绑定。如果把o改为this后①如果直接调用createPerson,则应用默认绑定,this被绑定到全局对象(非严格模式)②如果使用new调用createPerson,则this被绑定到new创建的对象。
可以参考《你不知道的JavaScript》或JavaScript秘密花园,里面有提到this绑定的几种情况。