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

本文介绍了JavaScript中对象的创建方式,包括原始模式、工厂模式、构造函数模式和原型模式,并探讨了每种模式的特点及不足。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.关于对象

1.原始模式
var person = new Object();
person.name="Jack";
person.age=29;
person.message=function ()
{
	alert(this.name+" is "+this.age);
};
alert(person.name);//Jack
person.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,banana
alert(person2.likeFruit);//apple,mango,lemon,banana
alert(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,mango
person.message();//Jack
person2.message();//David

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


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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值