面向对象 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;
}
不能通过实例重写原型中的值
但是如果原型中是引用型的 实例对其操作 会影响原型中的引用类型数值
面向对象 part3 构造函数 原型函数的更多相关文章
- javascript 面向对象 new 关键字 原型链 构造函数
JavaScript面向对象JavaScript 语言使用构造函数(constructor)作为对象的模板.所谓"构造函数",就是专门用来生成实例对象的函数.它就是对象的模板,描述 ...
- 从认识面向对象到构造函数的标准写法(构造函数的继承、多态、ECMA6中新代替语法class) - 下
笔记一个包含:认识面向对象.构造函数的封装.继承.多态.ECMA6中新代替语法class 下:包括构造函数的继承.多态.ECMA6中新代替语法class 构造函数的继承 从父一级延续下来的属性和功能( ...
- 面向对象的JavaScript --- 原型模式和基于原型继承的JavaScript对象系统
面向对象的JavaScript --- 原型模式和基于原型继承的JavaScript对象系统 原型模式和基于原型继承的JavaScript对象系统 在 Brendan Eich 为 JavaScrip ...
- JavaScript面向对象深入理解原型
原型模式 function Person(){ } Person.prototype.name="Ewarm"; Person.prototype.age="29&quo ...
- php面向对象之构造函数作用与方法
什么是构造函数呢?构造函数又有什么作用呢? 构造函数 ,是一种特殊的方法.主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中.特别的一个类可以有多个 ...
- PHP面向对象 实例化 构造函数 封装 继承 静态
PHP面向对象 实例化 构造函数 封装 继承 静态 面向对象: 一:定义类 class Dog { var $name; var $age; var $pinzhong; function Jiao( ...
- js构造函数+原型
注:普通对象与函数对象 var o1 = {}; var o2 =new Object(); var o3 = new f1(); function f1(){}; var f2 = function ...
- JS特殊函数(Function()构造函数、函数直接量)区别介绍
函数定义 函数是由这样的方式进行声明的:关键字 function.函数名.一组参数,以及置于括号中的待执行代码. 函数的构造语法有这三种: 1.function functionName(arg0, ...
- Node.js:util.inherits 面向对象特性【原型】
/** * Created by Administrator on 2014/9/4. */ var util = require('util'); function Base() { this.na ...
随机推荐
- case...when...和decode——oracle
1.decode函数: 用法:decode(条件,值1,翻译1,值2,翻译2,......,缺省值): 例子: ','失败','未知') from table t1;--改变字段的显示值 ,变量1,变 ...
- ssh-keygen 签名ca证书
介绍 ssh-keygen命令用于为"ssh" 生成,管理和转换认证秘钥,支持RSA和DSA两种认证秘钥 生成秘钥对 ssh-keygen -b 2048 -C milo -f 2 ...
- POJ 1284:Primitive Roots 求原根的数量
Primitive Roots Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3381 Accepted: 1980 D ...
- StarUML 3.0.2安装激活
文章参考:https://blog.csdn.net/sam_shan/article/details/80585240 1.下载StarUML:http://staruml.io/,一直下一步安装. ...
- libevent简介
一.参考资料 1.ubuntu下安装libevent 2.libevent实现TCP 服务端
- javascript面向对象编程的3种常见封装形式解析
javascript如何才能脱离函数式编程,拥抱面向对象编程呢,常见的有3种形式,其它形式可以说都是这3种的变种. 1.直接定义对象直接量的形式 var Util={ getType: ...
- [题解] Luogu P4245 [模板]任意模数NTT
三模NTT 不会... 都0202年了,还有人写三模NTT啊... 讲一个好写点的做法吧: 首先取一个阀值\(w\),然后把多项式的每个系数写成\(aw + c(c < w)\)的形式,换句话说 ...
- leetcode406 ,131,1091 python
LeetCode 406. Queue Reconstruction by Height 解题报告题目描述Suppose you have a random list of people standi ...
- localStorage中使用json
function setLocalJson(name, json) { json = JSON.stringify(json); localStorage.setItem(name, json)} f ...
- docker修改存储路径(转载)
系统盘只有40G,有时docker镜像会占据大量的存储空间,于是想把docker的默认存储位置改成挂载的数据盘.docker的默认存储位置未为:/var/lib/docker 更改docker的默认存 ...