-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
function createJsPerson(name,age) {
var obj = {};
obj.name = name;
obj.age = age;
obj.writeJs = function () {
console.log("my name is " + this.name + ",i can write js!");
};
return obj;
}
var p1 = createJsPerson("yang",18);
p1.writeJs();
var p2 = createJsPerson("hang",18);
p2.writeJs();
以上是工厂模式。
构造函数的目的:创建一个自定义类,并且创造这个类的实例。
构造函数模式和工厂模式的区别:
- 执行的时候
普通函数执行--->createJsPerson()
构造函数模式--->new CreateJsPerson()通过new执行后,我们的CreateJsPerson就是一个类了
而函数执行的返回值(p1)就是CreateJsPerson这个类的一个实例
扩展:
内置类也是如此
创建一个数组:
var ary = [ ];——字面量方式
var ary = new Array();——实例创建的方式--->构造函数模式执行的方式
不管哪种方式ary都是Array这个类的实例
- 函数代码执行的时候
相同:都是形成一个私有的作用域,然后 形参赋值--->预解释--->代码从上到下执行(类和普通函数一样,它也有普通函数的一面)
不同:- 在代码执行之前,不用自己再手动的创建
obj对象了,浏览器会默认的创建一个对象数据类型的值(这个对象其实就是我们当前类的一个实例), - 接下来代码从上到下执行,以当前实例为执行的主体(
this代表的就是当前的实例),然后分别的把属性名和属性值赋值给当前的实例, - 最后浏览器会默认的把创建的实例返回
function CreateJsPerson(name,age) { // 浏览器默认创建的对象就是我们的实例p1--->this this.name = name; this.age = age; this.writeJs = function () { console.log("my name is " + this.name + ",i can write js!"); }; // 浏览器再把创建的实例默认的返回 } var p1 = new CreateJsPerson("yang",18); p1.writeJs(); - 在代码执行之前,不用自己再手动的创建
扩展:
1、JS中所有的类都是函数数据类型的,它通过new执行变成了一个类,但是它本身也是一个普通的函数。
2、JS中所有的实例都是对象数据类型的
3、在构造函数模式中,类中(函数体中)出现的this.xxx=xxx中的this是当前类的一个实例
function CreateJsPerson(name,age) {
// 浏览器默认创建的对象就是我们的实例p1--->this
this.name = name;
this.age = age;
this.writeJs = function () {
console.log("my name is " + this.name + ",i can write js!");
};
}
var p1 = new CreateJsPerson("yang",18);
p1.writeJs();
var p2 = new CreateJsPerson("fang",17);
p2.writeJs();
var p3 = new CreateJsPerson("hang",19);
p3.writeJs();
4、p1和p2都是CreateJsPerson这个类的实例,所以都拥有writeJs这个方法,但是不同实例之间的方法是不一样的
//在类中给实例增加的属性(this.xxx=xxx)属于当前实例的私有的属性,实例和实例之间是单独的个体,所以私有的属性之间是不相等的
console.log(p1.writeJs === p2.writeJs); // false
Metadata
Metadata
Assignees
Labels
No labels