当前位置: 首页 > news >正文

昼猫笔记 JavaScript -- 面向对象(I)

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


 

本文主要内容:面向对象

预计阅读时间: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);
View Code

 

转载于:https://www.cnblogs.com/zhoumao/p/10247868.html

相关文章:

  • 在Activity中为什么要用managedQuery()
  • uoj#352. 新年的五维几何(概率期望+爆搜)
  • 自己编写的一个Javascript正则表达式对象
  • 几张关于IT业人才成长的统计图片
  • POJ 2029
  • sed命令教程
  • jquery版本
  • 【M19】了解临时对象的来源
  • NSTimer的详细用法
  • Windows下安装Scrapy方法及常见安装问题总结——Scrapy安装教程
  • c# Winform上传文件
  • Codeforces Round #532 (Div. 2)
  • Ubuntu 图形处理软件
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 创建Windows服务简单流程
  • 分享一款快速APP功能测试工具
  • EOS是什么
  • golang 发送GET和POST示例
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • JavaScript设计模式之工厂模式
  • Netty源码解析1-Buffer
  • quasar-framework cnodejs社区
  • spring boot 整合mybatis 无法输出sql的问题
  • 从重复到重用
  • 关于springcloud Gateway中的限流
  • 前端知识点整理(待续)
  • 如何优雅地使用 Sublime Text
  • 山寨一个 Promise
  • 积累各种好的链接
  • 扩展资源服务器解决oauth2 性能瓶颈
  • # 达梦数据库知识点
  • #stm32驱动外设模块总结w5500模块
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (poj1.2.1)1970(筛选法模拟)
  • (二)PySpark3:SparkSQL编程
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (六)c52学习之旅-独立按键
  • (全注解开发)学习Spring-MVC的第三天
  • (转)jdk与jre的区别
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET 读取 JSON格式的数据
  • .net 反编译_.net反编译的相关问题
  • .NET构架之我见
  • .Net中的设计模式——Factory Method模式
  • .stream().map与.stream().flatMap的使用
  • [1127]图形打印 sdutOJ
  • [30期] 我的学习方法
  • [C++] Windows中字符串函数的种类
  • [Django 0-1] Core.Checks 模块
  • [Django开源学习 1]django-vue-admin
  • [HackMyVM]靶场 Quick3
  • [Hive] INSERT OVERWRITE DIRECTORY要注意的问题
  • [Manacher]【学习笔记】
  • [NOI 2016]优秀的拆分