1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > js面向对象之创建对象1

js面向对象之创建对象1

时间:2018-10-23 09:08:38

相关推荐

js面向对象之创建对象1

方法一:工厂模式

所谓工厂模式,简单点儿说就是按照工厂生产的过程创建对象,原材料->加工->返还产品

1 function createPerson(name,age,job) 2 { 3//送入原材料 4var o = new Object(); 5//加工 6o.name = name; 7o.age = age; 8o.job = job; 9o.sayName = function(){10 alert(this.name);11}12//出厂13return o ;14 }15 16 var person1 = createPerson("Nicole",12,"software engnieer");17 var person2 = createPerson("Join",15,"writer");

优点很明显,解决了创建多个具有相似属性和方法的对象的问题,但是却没有解决对象识别的问题

比方说:

alert(person1 instance of Object);//truealert(person1 instance of createPerson);//false

方法二:构造函数模式

function Person(name,age,job){this.name = name;this.age = age;this.job = job;this.sayName = function(){alert(this.name);}}var person1 = new Person("Nicole",12,"software engnieer");var person2 = new Person("Join",15,"writer");

从上面可以看出,构造函数模式,不在函数内部创建Object对象,而是用this代替,最后创建实例时使用new

其中:

var person1 = new Person("Nicole",12,"software engnieer");

经历了以下几个过程:

1.var o = new Object();

2.o = this(Person);

3.执行构造函数中的代码;

4.返回新对象

优点:1.使用new创建对象,更符合面向对象的创建习惯;

2.红宝书上说创建构造函数意味着将它的实例标识为一种特定的类型,我的理解是,就是创建了一种类型,你可以用它去创建实例。

alert(person1 instanceof Object);//truealert(person1 instanceof Person);//true

为什么可以这样呢,因为你用Person实例化的对象,它都保存了一个constructor属性,指向Person。

alert(person1.constructor == Person);//truealert(person2.constructor == Person);//true

缺点:首先,我们看一段代码:

this.sayName = function(){}this.sayName = new Function("");

这两段代码在逻辑上是等价的,也就是说在ECMAscript中,函数是对象,每定义一个函数,就会实例化一个对象,因此,不同实例的不同函数是不相等的,用构造函数模式创建的对象,虽然看起来是大家“共用”了一个功能函数,但其实它们都是不同的对象,这就很没有必要。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。