Skip to content

构造函数模式 #10

@Yangxiaqing

Description

@Yangxiaqing
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

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions