18_面向对象程序设计(对象【一】类的创建于实例对象)

    面向对象的语言有一个标志,那就是他们都有类的概念,通过类可以创建任意多个具有相同属性和方法的对象。但是在ECMAScript中没有类的概念,但是我们可以通过其他方式来模拟面向对象的类。

//一个简单的对象
var obj = new Object();
var obj = {};
obj.name = "z3";
obj.sex = "男";
obj.sayName = function(){
    console.info("我是张三!");
};

    创建对象的方式
        1、工厂模式:工厂模式是软件工厂领域中一种广为人知的设计模式;

//对象的创建方式,建议使用构造函数式
//第一种形式 工厂模式
function createPerson(name, sex, age){
    var obj = {};
    obj.name = name;
    obj.sex = sex;
    obj.age = age;
    obj.sayName = function(){
        console.info(this.name);
    };
    return obj;
}

var p1 = createPerson("z3", "男", 20);
var p2 = createPerson("z4", "女", 25);
console.info(p1.sex);
p2.sayName();

        2、构造函数模式:比如像ECMAScript中的Array、Object、Date等都是通过构造函数来创建的。

//第二种 构造函数式 使用new关键字创建 例如new Array() new Date();
function Person(name, age, sex){
    this.name = name;
    this.age = age;
    this.sex = sex;
    this.sayName = function(){
        console.info(this.name);    
    }
}

//构造一个对象,使用new关键字 传递参数,执行模版代码,返回对象
var p1 = new Person("xiao A", 20, "男");
var p2 = new Person("xiao B", 21, "女");
console.info(p1.name);
p1.sayName();

console.info(p1 == p2); //false 类的概念:根据模版创建不同的实例对象
console.info(p1.constructor === Person); //true
console.info(Person.prototype.constructor === Person); //true
console.info(p1.constructor == p2.constructor); //true

    使用构造函数创建对象的几种方式:

//1 当作构造函数使用 使用new关键字(常用)
var p = new Person("abc", 20, "男");
console.info(p);

//2 当作一般函数使用
Person("abc", 20, "男"); //在全局环境里定义属性并复制 直接定义在window上
console.info(name);
console.info(age);
console.info(sex);

//3 使用call、apply关键字在另一个对象的作用域中调用
var o = {};
Person.call(o, "abc", 20, "男");
console.info(o);

//第一种和第三种方式还是有区别的
console.info(p instanceof Object); //true
console.info(p instanceof Person); //true
console.info(o instanceof Object); //true
console.info(o instanceof Person); //false


你可能感兴趣的:(了解面向对象程序的特点,学会JS模拟面向对象的方式)