关于javascript面向对象(面对初学者)

来源:互联网 发布:unity3d 控制人物移动 编辑:程序博客网 时间:2024/05/19 12:24

1.关于对象

1.原始模式
var person = new Object();person.name="Jack";person.age=29;person.message=function (){alert(this.name+" is "+this.age);};alert(person.name);//Jackperson.message();//Jack is 29

2.创建对象
分为三种模式:

(1)工厂模式:

function Person(name,age,hobby){  var a= new Object();//在函数中创建一个类  a.name=name;  a.age=age;  a.hobby=hobby;  a.message=function (){  alert(this.name+" is "+this.age);  };  return a;//将这个值作为返回值返回回去  }  var person=Person("Jack",29,"swimming");//通过实例化一个类  person.message();//Jack is 29  

当时也许工厂模式解决了大量相似对象创建的问题,通过调用一个函数进行传值,并返回一个对象,但是随着javascript的发展,其也出现了弊端,无法识  别对象,随后便有了构造函数


(2)构造函数

function Person(name,age,hobby){this.name=name;this.age=age;this.hobby=hobby;    this.message=function (){    alert(this.name+" is "+this.age);    };  }  var person=new Person("Jack",29,"swimming");  var person2=new Person("David",28,"running");  person.message();//Jack is 29


构造函数和工厂函数最大的区别:
   (1)不需要在函数内再创建一个类,也不需要显式地创建对象
   (2)没有return一个对象回去
   (3)所有的属性和方法直接给this,而this的指针指向的是person
   (4)补充:构造函数与其他函数最大的区别是调用方法不同,构造函数需要通过new操作符来调用


接下来通过测试person和person2的属性来确定其比工厂函数好的地方:
  person.constructor==Person;//true
  person2.constructor==Person;//true
  然后用instanceof测试:
  person instanceof Person;//true
  person instanceof Person;//true
  可见构造函数可以将其实例视为一种特定类型,而工厂函数并未做到

缺点:
   person.message==person2.message;//false
   这代表什么嘞?
   当构造函数有方法和属性都是一模一样的内容时,每一次生成一个实例,都必须为重复的内容,多占用一些内存。这样既不环保,也缺乏效率。
   为此原型很好的解决了这个问题。


3.原型(prototype)模式

function Person(){  }Person.prototype.name="Jack";Person.prototype.age=29;Person.prototype.hobby="swimming";Person.prototype.message=function (){   alert(this.name);};var person=new Person();var person2=new Person();alert(person.message==person2.message);//true

这次原型模式解决了构造函数所存在的问题

不过原型模式虽然很好的节约了内存的问题,但是其还是有问题的:

function Fruit(){}Fruit.prototype={name:"Jack",age:29,likeFruit:["apple","mango"]};var person=new Fruit();var person2=new Fruit();person.likeFruit.push("lemon");person2.likeFruit.push("banana");alert(person.likeFruit);//apple,mango,lemon,bananaalert(person2.likeFruit);//apple,mango,lemon,bananaalert(person.likeFruit===person2.likeFruit);//true

为什么给person加的值,在person2也会出现?
而且两个类的值是相同的,这便是原型函数的问题

所以一般将两者组合起来使用:
function Person(name,age,hobby){this.name=name;this.age=age;this.hobby=hobby;    this.likeFruit=["apple","mango"];}Person.prototype={message : function (){alert(this.name);}}var person =new Person("Jack",29,"swimming");var person2=new Person("David",28,"running");person.likeFruit.push("lemon");alert(person2.likeFruit);//apple,mangoperson.message();//Jackperson2.message();//David

这样就可以规避上面出现的一些问题


上面知识是自己通过看书和自己归纳的,自己归纳地可能有些会有不太准确的,这个也是自己第一次写博客,许多功能还不会用,希望得到大家指点,谢谢