面向对象 part3 构造函数 原型函数
6.2创建对象
方法:对象字面量 object构造函数
缺点:都是创建单个对象。同一个接口创建多个对象,会产生大量重复代码
6.2.1工厂模式
用函数封装以特定的接口创建对象
function createPerson (name,age) { //返回一个对象的函数就是工厂函数 var obj = { name: name, age: age, sstName: function (name) { this.name = name } } return obj }
- 适用场景:需要创建多个对象。
- 缺点: 对象没有一个具体的类型、都是Object类型。
6.2.2构造函数模式
与工厂函数区别:
- 没有return
- 没有显式创建对象
- 直接将属性和方法赋予给this
要创建新实例,必须用new操作符
- 创建一个新对象
- 将构造函数的作用域赋予给新对象(因此this便指向新对象)
- 执行构造函数中的代码(为这个新对象添加属性)
- 返回新对象
function Person (name,age) { this.name = name this.age = age this.setName = function (name) { this.name = name } } var p1 = new Person('tom',15) var p2 = new Person('jack',14) console.log(p1 instanceof Person) //true p1是Person类型 function student (name,grade) { this.name = name this.grade = grade } var s1 = new student('peter',6) console.log(s1 instanceof student) //true s1是student类型 console.log(p1,p2)
- 使用场景: 需要创建多个类型确定的对象。(实例标示为以˙哦那个特定的类型)
- 缺点: 每个对象都有相同的数据(方法),浪费内存。
//不同实例里面创建的方法,不是同一个function的实例 他们是不想等的,因此,创建两个完成同样任务的function实力实在多余
c = function() {console.log("sad")} b = function() {console.log("sad")} b instanceof c // false b === c //false 就算是功能相同的两个函数也是不想等 甚至就算是同名 【在js中,引用类型比较的是地址, 函数是一种引用类型】,而是存在两个不同 的内存地址
可以把函数写在构造函数外面 然后再引用
但是 但是全局函数非常容易被覆盖,也就是大家经常说的污染全局变量.
6.2.3原型模式
在构造器内部创建的实例方法会阻挡原型上定义的同名方法
function Persion() { this.likeIceCream = false; this.like = function () { return !this.likeIceCream; } } Persion.prototype.like = function () { return this.likeIceCream; } var p = new Persion(); p.like();//true
初始化操作的优先级如下:
- 首先,通过原型给对象实例添加属性
- 在构造器内部,给对象实例添加的属性
例子
function Persion() { this.likeIceCream = false; Persion.prototype.like = function () { return !this.likeIceCream; } } Persion.prototype.like = function () { return this.likeIceCream; } var p = new Persion(); p.like(); //true
在构造器内部的绑定操作优先级用于都高于在原型上的绑定操作的优先级。因为构造器的this上下文指向的是实例自身,所以,可以在构造器内对核心内容执行初始化操作
function Persion() { this.likeIceCream = false; Persion.prototype.like = function () { return !this.likeIceCream; } } Persion.prototype.like = function () { return this.likeIceCream; } Persion.prototype.like// () { return this.likeIceCream; } 说明影响的原因 是后来又调用了一次
function Persion() { this.likeIceCream = false; Persion.prototype.like = function () { return !this.likeIceCream; } } Persion.prototype.like = function () { return this.likeIceCream; } var p = new Persion(); p.like(); Persion.prototype.like = function () { return this.likeIceCream; } Persion.prototype.like // Persion.prototype.like = function () { return this.likeIceCream; }
不能通过实例重写原型中的值
但是如果原型中是引用型的 实例对其操作 会影响原型中的引用类型数值
本人是一个技术爱好者
1.但是每个技术爱好者都是从萌新开始的
2.我所有的博文都是我各方资料查阅(看的比较乱比较杂,因为有些是群里讨论等等来源,无法辨别出处,所以我的文章都是没有写明出处,都是我个人消化后整理,)
3.但是没有经过我实践的我一般会标注
4.希望大家共同交流共同进步,指出我的不足 谢谢

浙公网安备 33010602011771号