关于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这样就可以规避上面出现的一些问题上面知识是自己通过看书和自己归纳的,自己归纳地可能有些会有不太准确的,这个也是自己第一次写博客,许多功能还不会用,希望得到大家指点,谢谢
阅读全文
1 1
- 关于javascript面向对象(面对初学者)
- 关于javascript面向对象
- java初学者笔记_关于面向对象
- JAVA初学者[面对对象](一)
- (二)JavaScript中的面对对象
- 面对对象的javascript
- JavaScript面对对象(上)
- JavaScript面对对象编程
- 关于面向对象的javascript
- 关于JavaScript的面向对象
- javascript之面对对象设计
- javascript关于面向对象的总结
- javascript关于面向对象的总结
- javascript--关于面向对象的笔记
- 关于对JavaScript面向对象的理解
- JavaScript关于面向对象的那些事儿
- 关于JavaScript面向对象的一个示例
- 关于面对对象的知识点
- C#中的运算符优先级
- 野生程序员眼中的Linux系统
- jquery操作select(取值,设置选中)
- 新浪微博账号购买平台
- linux permission denied
- 关于javascript面向对象(面对初学者)
- Python os.walk遍历文件夹的小错误解决办法
- JPA,Hibernate实现
- 自己的redis秒杀[生成订单入库]
- MySQL设计编码规范
- Shiro介绍和使用
- HDU
- Redis简介
- 机器学习、数据挖掘方面好书