美文网首页
JS的原型和闭包(1-3)

JS的原型和闭包(1-3)

作者: zzyo96 | 来源:发表于2019-08-05 23:26 被阅读0次
原文地址 https://www.cnblogs.com/wangfupeng1988/p/3977987.html

一切(引用类型)都是对象,对象是属性的集合。

对象都是通过函数创建的

一、 typeof 和 instanceof

  function show(x) {

            console.log(typeof x);    // undefined
            console.log(typeof 10);   // number
            console.log(typeof 'abc'); // string
            console.log(typeof true);  // boolean

            console.log(typeof function () {});  //function

            console.log(typeof [1, 'a', true]);  //object
            console.log(typeof { a: 10, b: 20 });  //object
            console.log(typeof null);  //object
            console.log(typeof new Number(10));  //object
        }
        show();

以上代码列出了typeof输出的集中类型标识,其中上面的四种(undefined, number, string, boolean)属于简单的值类型,不是对象。
剩下的几种情况——函数、数组、对象、null、new Number(10)都是对象。他们都是引用类型。

判断一个变量是不是对象非常简单。值类型的类型判断用typeof,引用类型的类型判断用instanceof。

var fn = function () { };
console.log(fn instanceof Object);  // true

二、对象->若干属性的集合(死背)

javascript中数组是对象,函数是对象,对象还是对象。对象里面的一切都是属性,只有属性,没有方法。那么方法如何表示呢?——方法也是一种属性。表示为键值对的形式。

image.png

而且javascript中的对象可以任意的扩展属性,没有约束。

以上代码中,obj是一个自定义的对象,其中a、b、c就是它的属性,而且在c的属性值还是一个对象,它又有name、year两个属性。

问题:函数和数组也是对象,他们也可以定义属性吗?当然不行,但是它可以用另一种形式,总之函数/数组之流,只要是对象,它就是属性的集合。

以函数为例:

      var fn = function () {
            alert(100);
        };
        fn.a = 10;
        fn.b = function () {
            alert(123);
        };
        fn.c = {
            name: "王福朋",
            year: 1988
        };

上段代码中,函数就作为对象被赋值了a、b、c三个属性——很明显,这就是属性的集合。

在jQuery源码中,“jQuery”或者“$”,这个变量其实是一个函数。

console.log(typeof $);  // function
console.log($.trim(" ABC "));

" jquery "的确是个函数。那么咱们常用的 “doller.trim() ”也是个函数。很明显,这就是在$或者jQuery函数上加了一个trim属性,属性值是函数,作用是截取前后空格。

——————————————————————

三、对象都是通过函数创建的

看个栗子

  function Fn() {
          this.name = '王福朋';
          this.year = 1988;
 }
 var fn1 = new Fn();

fn1.name = '王福朋'
fn1.year = 1988

我们平时所创建的对象或者数组

var obj = { a: 10, b: 20 };
var arr = [5, 'x', true];

其实代码的本质是:


        //var obj = { a: 10, b: 20 };
        //var arr = [5, 'x', true];

        var obj = new Object();
        obj.a = 10;
        obj.b = 20;

        var arr = new Array();
        arr[0] = 5;
        arr[1] = 'x';
        arr[2] = true;

而其中的 Object 和 Array 都是函数:

console.log(typeof (Object));  // function
console.log(typeof (Array));  // function
所以说,对象都是通过函数来创建的

————————————————————

四、--prototype原型

函数也是一种对象。他也是属性的集合,我们可以对函数进行自定义属性。

不用等咱们去试验,javascript自己就先做了表率,人家就默认的给函数一个属性——prototype。对,每个函数都有一个属性叫做prototype。

这个prototype的属性值是一个对象(属性的集合,再次强调!),默认的只有一个叫做constructor的属性,指向这个函数本身。

你也可以在自己自定义的方法的prototype中新增自己的属性

 function Fn() { }
        Fn.prototype.name = '王福朋';
        Fn.prototype.getYear = function () {
            return 1988;
        };

这样就成了

image.png

代码演示:


        function Fn() { }
        Fn.prototype.name = '王福朋';
        Fn.prototype.getYear = function () {
            return 1988;
        };

        var fn = new Fn();
        console.log(fn.name);
        console.log(fn.getYear());

即,Fn是一个函数,fn对象是从Fn函数new出来的,这样fn对象就可以调用Fn.prototype中的属性。

因为每个对象都有一个隐藏的属性——“proto”,这个属性引用了创建这个对象的函数的prototype。即:fn.proto === Fn.prototype

相关文章

  • JS的原型和闭包(1-3)

    原文地址 https://www.cnblogs.com/wangfupeng1988/p/3977987.ht...

  • 前端开发必须知道的JS(一) 原型和继承(转载)

    前端开发必须知道的JS(一) 原型和继承 原型和闭包是Js语言的难点,此文主要讲原型及原型实现的继承,在(二)中会...

  • 5-1 从基础知识到JSWebAPI

    回顾js基础知识 JS-web-API 总结 回顾js基础知识 变量类型和计算 原型和原型链 闭包与作用域 异步和...

  • JS-Web-Api

    JS基础知识,规定语法(ECMA262标准); 变量类型和计算 原型和原型链 作用域和闭包 异步和同步 JS We...

  • javascript面试准备(一)

    interview js 基础 原型 原型链 作用域 闭包 异步 单线程 js Api dom 操作 ajax 事...

  • 6.js-Web-API-DOM、BOM

    js基础知识:基于ECMA 262标准(规定基础语法、规则) --变量类型和计算--原型和原型链--闭包和作用域-...

  • php之闭包函数(Closure)

    php闭包函数(Closure) JS闭包 js和php闭包使用和区别

  • JS博客

    JS构造函数及new运算符 JS原型对象和原型链 函数作用域和作用域链 干货分享:让你分分钟学会JS闭包 深入理解...

  • js原型和闭包(10)——this

    其实,this的取值,分四种情况。我们来挨个看一下。 在此再强调一遍一个非常重要的知识点:在函数中this到底取何...

  • 原型链

    原型链 this指向 作用域和预解析 new关键字 闭包 继承 JS 规定,所有对象都有自己的原型对象(proto...

网友评论

      本文标题:JS的原型和闭包(1-3)

      本文链接:https://www.haomeiwen.com/subject/kgxbdctx.html