本文内容搬运自公众号 原文链接


本文主要内容:面向对象

预计阅读时间:6分钟

面向对象的方式

  • 单例模式(字面量定义) var obj = {}

  • 类的实例 var obj = new Object()

  • 工厂创建

  • 构造函数 扮演了三种角色,(普通函数、普通对象、类)

面向对象相关问题

  • 构造函数里的属性怎么看?看this,谁前面有this谁就是属性
function Zhoumao(name, age) {
var name = '昼猫'
this.name = name;
this.age = age; // name 不属于
}
  • 如何查找面向对象中的this
  1. 构造函数里的this执行实例对象

  2. 如果是方法中的this,分以下几种情况
    a. 找到this 在调用方式时,看方法前的 . 是谁,this就是谁
    b. 替换this 将this化成找到的那个结果
    c. 精确查找 用原型链查找模式

  3. 关于构造函数中的返回值
    构造函数也是函数,每个函数都有返回值,构造函数返回的是this

  4. 原型的批量添加和直接对象添加的区别

如果是批量添加属性,没有改变原型的内存地址(浏览器开辟)
如果是以对象形式添加,就会更改原型的内存地址,浏览器开辟的就会销毁

function Zhoumao() {
this.name = 'zhoumao'
}
Zhoumao.prototype.age = '12'
Zhoumao.prototype = {
sxc: 44
}
var zm = new Zhoumao
var hello = new Zhoumao
console.log(hello.age) // undefined
  • 如何给内置类添加方法

如果给内置类的原型添加方法,使用对象形式添加,不起作用。因为浏览器会保护内置类对象的原型内存地址,只能使用批量的形式添加方法

// 这种方法是错的
Array.prototype = {
sum: function () {}
// 只能用这种方法添加
Array.prototype.sum = function () {}
}
  • 拷贝

    • 浅拷贝:利用 for in 将一个对象的属性,一个一个的复制到另一个对象中
var obj = {
name: '昼猫',
age: '12'
}
var obj2 = {}
for(var key in obj){
obj2[key] = obj[key]
}
console.log(obj2)
    • 深拷贝:如果对象中的属性值又是一个引用数据类型,浅拷贝,还是把后面的引用数据类型的地址赋值给空对象的属性,深拷贝,将属性值一个个遍历赋值
//将其打包,方便以后使用
function extend(oldObj, newObj) {
for (var key in oldObj) {
var item = oldObj[key]
if (item instanceof Array) { // 数组
newObj[key] = []
extend(item, newObj[key])
} else if(item instanceof Object){ // 对象
newObj[key] = {}
extend(item, newObj[key])
}else { // 基本类型
newObj[key] = item
}
}
}
var obj = {
name: '昼猫',
age: '12',
ss: ['1', '2', '3'],
ssObj: {
sex: '男',
node: '昼猫笔记',
fun: function () {
console.log(111)
} }
}
var obj2 = {}
function extend(oldObj, newObj) {
for (var key in oldObj) {
var item = oldObj[key]
if (item instanceof Array) { // 数组
newObj[key] = []
extend(item, newObj[key])
} else if(item instanceof Object){ // 对象
newObj[key] = {}
extend(item, newObj[key])
}else { // 基本类型
newObj[key] = item
}
}
}
extend(obj, obj2);
console.log(obj2);

最新文章

  1. Asp.Net MVC中使用StreamReader读取“Post body”之应用场景。
  2. Python 基础 - 随机列表最大的两个值
  3. SQL数据缓存依赖 [SqlServer | Cache | SqlCacheDependency ]
  4. acm-DP整理
  5. RTP 协议
  6. go语言基础知识笔记(二)之数组和切片
  7. Startup在不同环境中的处理
  8. Linux 创建静态库(.a)和动态库(.so)
  9. js——this
  10. .NET并行计算和并发6-获取线程池的最大可用线程数
  11. 终止执行js的方法
  12. SD从零开始55-56, 风险管理, 付款卡
  13. postgres配置只能让某一个ip的主机登陆
  14. 8 -- 深入使用Spring -- 3...1 Resource实现类FileSystemResource
  15. spray json, jackson 转到type时多key和少key的比较
  16. Finding Hotels
  17. Unicode data in a Unicode-only collation or ntext data cannot be sent to clients using DB-Library (such as ISQL) or ODBC version 3.7 or earlier
  18. 自然语言处理 - 如何通俗地理解TFIDF?
  19. LightOJ 1088 - Points in Segments 二分
  20. maven构建jar包

热门文章

  1. 洛谷—— P2701 [USACO5.3]巨大的牛棚Big Barn
  2. Building a Space Station POJ 2031 【最小生成树 prim】
  3. 操作指定文件格式的10个Perl CPAN模块
  4. RvmTranslator7.1
  5. HDU 5344(MZL's xor-(ai+aj)的异或和)
  6. 51nod-1131: 覆盖数字的数量
  7. Optional arguments
  8. html局部页面打印
  9. 24 款必备的 Linux 桌面应用(2016 版)
  10. 使用WinNTSetup安装win10时提示efi part有红叉(win10安装UEFI系统安装)