创建对象和实例

这里以函数为对象,创建函数和函数的实例

方法1:早期模式

var person = new Object();
person.name = "Nicholas";
person.age = 29;
person.job = "Software Engineer";

person.sayName = function() {
alert(this.name);
};

方法2:对象字面量模式

//创建函数+函数的实例

var person = {
    name:"NIcholas",
    age:29,
    job: "Software Engineer",
    
    sayName: function() {
      alert(this.name);
    }
};

区别:

  • 没有用new创建对象
  • 没有“person.”表示属性的对象,而是花括号取代,表示属性对应哪个对象
  • 赋值符号由等号变成冒号

缺点:

  • 创建多个相似对象,有代码冗余,例如创建n个相似实例, sayName方法被写n次

方法3:工厂模式

//创建函数
function = createPerson(name, age, job){
    var o = new Object();
    o.name = name;
    o.age = age;
    o.job = job;
    o.sayName = function() {
        alert(this.name);
    };
    return o;
}
//调用函数以创建函数实例

var person1 = createPerson{"Nicholas", 29, "Software Engineer");
var person2 = createPerson("Greg", 27, "Doctor");

说明:

  • 对象的创建程序写(封装)在函数里,解决了创建多个相似对象不冗余

方法4:构造函数模式

//创建函数
function = Person(name, age, job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function() {
        alert(this.name);
    };
}

//调用函数来创建函数实例

//调用方式1:看作构造函数
var person1 = new Person{"Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");  //"Nicholas"

//调用方式2:看作普通函数
Person("Greg", 27, "Doctor");  //添加到window
window.sayName();  //"Greg"

//调用方式3:在另一个对象的作用域中使用
var o = new Object();
Person.call(o,"Kristen",25,"Nurse");
o.sayName();  //"Kristen"

区别:

  • Person()函数代替了createPerson()函数
  • 没有显式地创建对象
  • 直接将属性和方法赋给了this对象
  • 没有return语句
  • 函数名首字母用了大写

说明:

  • 不同实例上的同名函数是不相等的
    alert(person1.sayName == person2.sayName); //false

缺点:

  • 每个方法都要在每个实例上重新创建一遍。例如两个实例就创建了两个sayName()。

方法5:原型模式

//创建函数

function = Person(){
}

Person.prototype.name="NIcholas";
Person.prototype.age=29;
Person.prototype.job= "Software Engineer";
Person.prototype.sayName = function() {
        alert(this.name);
};

//调用函数来创建函数实例

var person1 = new Person();
person1.sayName(); // "Nicholas"

var person2 = new Person();
person2.sayName(); // "Nicholas"

用于检测
1、检测一个属性在实例还是在原型(《高程》p150-152)

  • hasOwnProperty()方法
    检查范围:实例
    属性存在对象实例中时,返回true
  • in操作符
    检查范围:实例+原型
    属性存在对象实例或原型时,返回true

所以,同时使用hasOwnProperty()方法和in操作符,就可以确定该属性到底是存在于对象中,还是存在于原型中,如下所示

//true=存在于原型中;false=存在于实例中
function hasPrototypeProperty(object,name){
    return !object.hasOwnProperty(name) && (name in Object);
}

constructor(构造函数)属性

原文地址:https://www.cnblogs.com/KarmaDeng/p/7397346.html