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

js学习笔记之自调用函数和原型链

 自调用函数
var name = 'world!';
    // console.log(typeof name)
    (function () {
        console.log(this.name, name, typeof name, typeof name === undefined)
        if(typeof name === undefined){
            var name = 'a!'
            console.log('hello ' + name)
        } else{
            var name = 'b!'
            console.log('hello ' + name)
        }
    })();

运行结果是
"world!" undefined "undefined" false
hello b!

这里有两个陷阱
第一个是变量提升后 name 值为 undefined
第二个是 typeof name 为字符串 "undefined" 
 

原型链
所有对象的 __proto__ 都指向其构造器的 prototype
所有函数对象的 __proto__ 都指向 Function.prototype,它是一个空函数(Empty function)
Object.prototype.__proto__ === null

function fn() {
        this.a = 10
        this.b = function () {
           console.log(this.a)
        }
    }
    fn.prototype = {
        b: function () {
            this.a = 20
            console.log(this.a)
        },
        c: function () {
            this.a = 30
            console.log(this.a)
        }
    }
    var myfn = new fn();
    console.log(myfn) //对象属性有a,b;原型链继承属性有b,c
console.log(myfn.__proto__ === fn.prototype) // true
console.log(myfn.__proto__ === myfn.constructor.prototype) // false
myfn.b() //10 
myfn.c() //30
myfn.b() //30
解析
myfn对象第一次调用b方法,由于原型链上的b方法被覆盖,所以始终调用自身的b方法,所以就输出初始值10
myfn调用c方法等于是调用继承的c方法,所以a属性被重新赋值,于是输出30
myfn第二次调用b方法,由于a属性已经被c方法重新赋值,所以继续输出30

myfn.__proto__始终指向构造器fn的prototype属性
但是myfn.__proto__不再指向myfn.constructor.prototype

myfn本身没有constructor属性,于是指向fn.prototype.constructor属性,
而fn.prototype.constructor本来应该指向其自身,但是因为重新赋值fn.prototype对象,所以fn.prototype的构造函数变成了Object

 

引用指针

var a = {n:1}; 
var b = a;  
a.x = a = {n:2}; 
console.log(a.x);// --> undefined 
console.log(b.x);// --> [object Object] 

 

转载于:https://www.cnblogs.com/nightstarsky/p/9182756.html

相关文章:

  • vivx面试题
  • centos7.2编译安装mysql5.7.21报错解决
  • 进程与线程区别
  • ASP.NET CORE系列【四】基于Claim登录授权
  • 【JSConf EU 2018】主题总结 (部分主题已有中文文章)
  • Java系列之EJB 理解
  • 百度echarts可以做什么
  • 第六章
  • Disruptor并发框架
  • Oracle基础学习(二) 存储过程和函数
  • (四)Linux Shell编程——输入输出重定向
  • RHEL6解决无法使用YUM源问题 {已验证切实可行}
  • .NET Core 中的路径问题
  • 太多脚本将会毁掉持续交付
  • java中的equals和==
  • JavaScript-如何实现克隆(clone)函数
  • [笔记] php常见简单功能及函数
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • [译]CSS 居中(Center)方法大合集
  • [译]前端离线指南(上)
  • 2017-09-12 前端日报
  • Docker入门(二) - Dockerfile
  • ES6之路之模块详解
  • gf框架之分页模块(五) - 自定义分页
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • Spark RDD学习: aggregate函数
  • spring学习第二天
  • SwizzleMethod 黑魔法
  • TCP拥塞控制
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • 基于 Babel 的 npm 包最小化设置
  • 记一次用 NodeJs 实现模拟登录的思路
  • 数据可视化之 Sankey 桑基图的实现
  • 微服务核心架构梳理
  • 学习JavaScript数据结构与算法 — 树
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • #1015 : KMP算法
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (26)4.7 字符函数和字符串函数
  • (6)添加vue-cookie
  • (九)c52学习之旅-定时器
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (转)C#调用WebService 基础
  • .NET BackgroundWorker
  • .net core 6 集成和使用 mongodb
  • .Net8 Blazor 尝鲜
  • .Net小白的大学四年,内含面经
  • .Net转前端开发-启航篇,如何定制博客园主题
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • @FeignClient注解,fallback和fallbackFactory
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname