开篇
function Dog() { // Dog 对象}`
var bigHuang = new Dog() // bigHuang dog的实例`
由来
面向对象是计算机语言的一种标志,他们有类的概念,而通过类,我们可以创建无数个对象去使用该类的方法和属性,这是极好的。但是在
ECMAScript是没有类的概念的,这就产生了一些问题,但是无数的能人志士相出了办法,用函数去模拟类,于是我们诞生了构造函数。。
需要具备的JS能力
js基础知识,知道对象,等基本引用类型。
属性操作符
下次在说把
正题
方式一 - 工厂模式
工厂模式是设计模式中一个广为流传的模式,这种模式抽象了创建具体对象的过程。如下,
function createPerson(name, age, job) {
var o = new Object()
o.name = name
o.age = age;
o.sayName = function () {alert (this.name)}
return o;
}
var person1 = createPerson('111', 18, 'aa');
var person2 = createPerson('222', 19, 'bb');
// 创建了这样一种方式,类似于投入一种固定类的产品,产出一种相同状态的产品,工厂模式给出了这样一种可能,我们能造出无数种这样的数据,
只是,我们任然不能识别出他是什么对象类型的,类似于我们都知道 '' 是字符串类型的样子。我们需要知道他的对象类型。
方式二 - 构造函数模式
function Person(name, age, job) {
this.name = name;
this.age = age;
this.sayName = function () {
alert(this.name);
}
}
var person1 = new Person('123', 19, 'engineer');
var person2 = new Person('24', 24, 'fale');
// 对比上述的两种写法,我么看到了
* 没有创建一个对象
* 将属性,方法赋给了 this
* 没有 return 返回值
* 函数名称首字母大写
* 创建实例时,必须要用到 new 关键字
-
我们称以大写字母开头的函数为构造函数,且到我们定义实例时是需要用到需要用 new 去实现的,这一步执行了什么?
创建了一个新对象
将构造函数的作用域赋给新对象
执行构造函数里的代码(赋值,属性,方法)
返回新对象
通过控制台打印我们能把person1 打印出来看下,在proto里有一个constructor.
`
alert(person1.constructor === Person) // true
alert(person2.constructor === Person) // true
`
通过该属性我们可以知道了 person2 是指向到 Person 的,(终于找到组织了)..
这个方法就本身来说,不是我们所推荐的方式。因为有 instanceof 这个操作符。
alert(person1 instanceof Object); // true
alert(person1 instanceof Person); // true
alert(person2 instanceof Object); // true
alert(person2 instanceof Person); // true
注意事项
**
不要将构造函数当作是函数使用,虽然它本身就是函数,任何函数,只要通过 new 关键字去引用那都是被看成是构造函数,但是,一般不建议这样做,我们要做的是遵守约定。