面向对象 part3 构造函数 原型函数
2024-09-02 05:15:50
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; }
不能通过实例重写原型中的值
但是如果原型中是引用型的 实例对其操作 会影响原型中的引用类型数值
最新文章
- 【LeetCode】Product of Array Except Self
- 关于raid的理解
- 多次drawRect,显示重叠,需要设置背景颜色
- C语言退出多层嵌套循环技巧
- sgu551 Preparing Problem
- 329. Longest Increasing Path in a Matrix
- 文档生成工具doxygen+图像生成工具GraphViz
- Android之TextView的样式类Span的使用具体解释
- delphi 利用HTTP的POST方法做个在线翻译的小工具 good
- mysql 异常处理
- 整合第二次(SSM第一次)------------>;spring+struts2+mybatis
- 使用 pprof 和 Flame-Graph 调试 Golang 应用
- Flask之 安装与HelloWorld
- gb2312,gbk,utf8的区别
- navicat 链接 mysql 报错1251
- 基于UML的毕业选题系统建模研究
- Python学习之not,and,or篇
- 【iCore4 双核心板_ARM】例程十六:USB_HID实验——双向数据传输
- 企业级Nginx增加日志选项
- [笔记] centos6.6编译安装httpd2.4.10