面向对象程序设计---创建对象

来源:互联网 发布:制作菜单图片软件 编辑:程序博客网 时间:2024/05/28 05:18

方法一:

对象字面量

方法二:

Object构造函数


方法三:工厂模式


function   createPerson(name,age,job){

var   o = new Object();

o.name = name;

o.age = age ;

o.job = job;

ob.sayName = function()

  {  

     alert(this.Name);

  }

retuen o ;

}

工厂模式虽然解决了创多个相似对象的问题,但没有解决对象识别的问题。

var  person1 = createPerson('nic',29,'ss');

var  person2 = createPerson('nic',22,'ss');


构造函数模式---与工厂模式的不同有三点:没有显示的创建对象;没有return 语句;直接将属性与方法赋值给了this对象;构造实例使用new关键字

function  Person(name,age,job){

this.name = name;

this.age= age;

this.job=job;

  this.sayName = function(){

    alert(this.name);

   }

}

var   person1 = new Person("aa",22,"coder");

var   person2 = new Person("b",33,"writer");

这样创建的两个对象实例都有自己的构造函数,创建的对象是Object的实例,也是Person的实例

alert(person1.constructor==Person);//true

alert(person1  instanecof  Object);//true

alert(person1 instanecof  Person);//true


构造函数和普通函数的区别----只是调用方式不同,任何函数只要通过new操作符来调用,它就可以作为构造函数

构造函数三种调用方式

一   

  //当作构造函数调用

var   person = new Person("nic",29,"software  enginner");

person.sayName();

二  

//当作普通函数调用

Person("Gerg",27"doctor");

window.sayName();

//在另一个对象的作用域中调用

var    o = new  Object();

Person.call(o,"kine”,25,"nurse");

o.sayName();

构造函数的问题:每个方法都要在每个实例上重新创建一遍即(person1.sayName == person2.sayName);//false

原型模式


我们创建 的每个函数都有一个原型属性,这个属性是一个指针,指向一个对象。

function Person(){}

Person.prototype.name = "Nicholas";

Perosn.protptype.age = 29;

Person.prototype.job = "soft  engineer";

Person.prototype.sayName = function(){

 alert(this.name)

}

var   person1 = new Person();

person1.sayName();

var  person2 = new Person();

alert(person1.sayName == person2.sayName);//true


每次访问对象属性的原理:首先搜索对象实例本身,如果没找到再搜索原型对象中有没有改名字的属性

实例的属性是在自己实例中获取或者在原型中获取

person1.hasOwnProperty("name")//只有存在实例中才返回true

person1.hsaPrototypeProperty()//如果存在实例中就返回false

alert("name" in  person1);//来自原型或者实例都返回true


原型属性遍历

var  key = Object.keys(Person.prototype);


更简单的原型语法

function   Perosn(){}

Person.protptype={

name :"nick",

age :29

job :"softwarw  engineer",

sayName:function(){

}

};

var  friend = new person();

alert(friend   instanceof  Object);//true

alert(friend   instanceof  Object);//true

alert(friend.constructor == Person);//false

alert(friend.constructor == Object);//true


对原型所做的修改都可以反映在实例中,都是先在实例中搜索sayHi属性,没有找到的情况下,会继续搜索原型

var    friend = new Person();

Person.prototype.sayHi = function(){

  alert("hi");

}

friend.sayHi();//“hi”

实例中的指针仅仅指向原型,而不指向构造函数

function  Person(){}

var    friend = new Person();

Person.prototype = {

constructor:Person,

name:"nick",

age :29,

job:"software engineer",

sayName:function(){

alert(this.name);

}

}



原型模式的问题缺陷:所有的实例在默认情况下都取得相同的属性值;一个实例修改;了原型值,其他实例受到影响


阅读全文
0 0
原创粉丝点击