javascript 之 面向对象【建立对象】

建立对象 函数

    (1) 工厂模式       this

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");
存在的问题:没有解决对象时别问题(怎么知道一个对象的类型)

  (2)构造函数模式prototype

      注意点:构造函数始终都应该以一个大写字母开头,而非构造函数则应该以一个小写字母开头指针

function Person(name, age, job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function(){
        alert(this.name);
    };
}
与上面进行比较
1/没有显示的建立对象
2/直接将属性和方法赋给了this对象
3/没有return语句
var person1 = new Person("Nicholas", 29, "Software Engineer"); 
var person2 = new Person("Greg", 27, "Doctor");
建立Person新实例必须使用new操做符,对应着四个步骤
1/建立新的对象
2/将构造函数的做用域给新对象
3/执行构造函数中的代码
4/返回新对象

//做为普通函数调用
Person(Greg,27,Doctor)//添加到window
window.sayName();
//在另外一个对象的做用域中调用
var o=new Object();
Person.call(o,Kristen,25,Nurser)
o.sayName()

存在的问题:每一个方法都要在每一个实例上从新建立一遍,person1和person2都有一个sayName()方法,但实际这两个方法不知同样的

  (3)原型模式对象

每一个函数都有一个prototype属性,这个属性是一个指针,指向一个对象
好处:能够让全部对象实例共享它所包含的属性和方法
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" alert(person1.sayName == person2.sayName); //true

//说明:在ECMAScript新增方法Object.getPrototypeOf()

   alert(Object.getPrototypeOf(person1) == Person.prototype); //true
   alert(Object.getPrototypeOf(person1).name); //"Nicholas"blog

   在这里,解析器实际执行了两次搜索,第一次:person1有name属性吗,答:没有 ;第二次:person1的原型有这个属性吗,答:有。ip

 

//若实例存在和实例原型中同样的属性同名,那么实例中的属性会屏蔽原型中的属性作用域

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();
var person2 = new Person();
person1.name = "Greg";
alert(person1.name); //"Greg"——来自实例
alert(person2.name); //"Nicholas"——来自原型
delete person1.name;
alert(person1.name); //"Nicholas" ——来自原型get

//原型与in操做符原型

in操做符会在经过对象访问给定属性时返回true,不管该属性存在于实例仍是原型中

alert(person1.hasOwnProperty("name")); //false 

alert(person1.hasPrototypeProperty("name")) // true

alert("name" in person1); //true

person1.name = "Greg";
alert(person1.name); //"Greg" ——来自实例
alert(person1.hasOwnProperty("name")); //true

//hasOwnProperty判断是来自于原型属性时 返回false;

//hasPrototypeProperty判断是来自于原型属性时,返回true;

相关文章
相关标签/搜索