美文网首页🐋成员文章 让前端飞Web前端之路
javascript 基础攻关(二)—— 原型和原型链

javascript 基础攻关(二)—— 原型和原型链

作者: 姚冰coding | 来源:发表于2017-07-12 06:38 被阅读147次

javascript 基础攻关(二)—— 原型和原型链

  1. 如何判断一个变量是数组类型
  2. 写一个原型链继承的例子
  3. 描述new一个对象的过程

构造函数

// 声明构造函数
function Foo(name, age) {
    this.name = name;
    this.age = age;
    this.class = "class-1";
    return this; //隐示创建
}
// 创建对象
var f =new Foo('yao',25);

构造函数扩展

  • var a = {} 其实是 var a = new Object()的语法糖
  • var a = [] 其实是 var a = new Array()的语法糖
  • function Foo(){...} 其实是 var Foo = new Function(){...}
  • 使用instanceof判断一个函数是否是一个变量的构造函数

原型规则

  1. 所有的引用类型(数组、对象、函数),都具有对象的特性,即可以自由扩展属性(除了null
  2. 所有的引用类型(数组、对象、函数),都有一个__proto__属性(隐式原型),属性值是一个普通的对象
  3. 所有的函数,都有一个prototype属性(显式原型),属性值也是一个普通的对象
  4. 所有的引用类型(数组、对象、函数),__proto__属性指向它的构造函数的prototype属性值
  5. 当试图得到一个对象的属性时,如果这个对象本身没有这个属性,那么它回去它的__proto__(即它的构造函数的prototype)中寻找

原型链

// 声明构造函数
function Foo(name, age) {
    this.name = name;
    this.age = age;
    this.class = "class-1";
    return this; //隐示创建
}
// 创建对象
var f =new Foo('yao',25);
f.toString()    要去f.__proto__.__proto__中查找,也就是它的构造函数的object中找
2-8原链-0002.png

instanceof

f instanceof Foo的判断逻辑是:

  1. f 的 __proto__ 一层一层往上,能否对应到 Foo.prototype
  2. 再试着判断 f instanceof Object

题目解答:

  1. 如何判断一个变量是数组类型
```js
    var arr=[];
    arr instanceof Array;   //true
    typeof arr;     //Object, typeof 是无法判断数组的
```
    这里要使用`instanceof` 而不是`typeof`,`typeof`判断出来是Object。
  1. 写一个原型链继承的例子

    ```js
    function Elem(id) {
        this.elem = document.getElementById(id)
    }
    
    Elem.prototype.html = function(val) {
        var elem = this.elem;
        if (val) {
            elem.innerHtml = val;
            return this; //链式操作
        } else {
            return elem.innerHtml;
        }
    }
    Elem.prototype.on = function(type, fn) {
        var elem = this.elem;
        elem.addEventListener(type, fn)
    }
    
    // 使用
    var div1 = new Elem('div1');
    console.log(div1.html());
    div1.html("<p>hello</p>");
    div1.on('click', function() {
        alert('clicked');
    })
    
    ```
    
  2. 描述new一个对象的过程

    1. 创建一个新对象
    2. this指向这个新对象
    3. 执行代码,对this赋值
    4. 返回this(隐式返回)

补充:

image.png

相关文章

  • javascript 基础攻关(二)—— 原型和原型链

    javascript 基础攻关(二)—— 原型和原型链 如何判断一个变量是数组类型 写一个原型链继承的例子 描述...

  • js原型、原型链、继承的理解

    一、原型、原型链 原型是Javascript中的继承的基础,JavaScript的继承主要依靠原型链来实现的。 原...

  • javascript碎片知识001

    javascript中的对象(原型,原型链) 什么是原型? 原型是JavaScript中的继承的基础,JavaSc...

  • JS进阶(1) —— 人人都能懂的构造函数

    大家都知道原型和原型链是 JavaScript 中最经典的问题之一,而构造函数又是原型和原型链的基础,所以先了解清...

  • JavaScript 原型、原型链与原型继承

    原型,原型链与原型继承 用自己的方式理解原型,原型链和原型继承 javascript——原型与原型链 JavaSc...

  • Javascript基础篇

    本文主要介绍Javascript(interview)基础语法。 1.原型 和 原型链 2.继承 2.1 js的继...

  • 原型和原型链篇

    原型和原型链 1.理解原型设计模式以及JavaScript中的原型规则 原型设计模式JavaScript是一种基于...

  • 原型、原型链

    (什么是原型、原型链?有什么作用) JavaScirpt深入之从原型到原型链 图解 Javascript 原型链 ...

  • 【javascript】继承

    javascript只支持实现继承,而且继承主要是依靠原型链来实现的。 原型链 javascript将原型链作为实...

  • 4.4 JavaScript

    4.4.1. 原型链 4.4.1.1. 显式原型和隐式原型   JavaScript的原型分为显式原型(expli...

网友评论

  • 9f1cc79ea930:求面试题答案
  • 爱喝茶的小姐姐:是怎么做到 这么多人关注了 还收获了这么多喜欢:relieved: 感觉要成为大牛的节奏了
    姚冰coding:基本都是来自给掘金的投稿那篇面试题
  • 亚军同学:最近也在看这个视频,巩固下基础,关注你很久了,谢谢笔记分享!
    姚冰coding:@Lemon_0613 嗯,很不错,强烈推荐。这课程感觉是我在慕课看的最值得。
  • JessLong:很多干货 继承还是不太理解:relieved::relieved:
    姚冰coding:继承看原型链那个图,每个引用类型都有隐示的__proto__属性,指向上一级的父亲的prototype属性。所以对象就指向构造函数,构造函数如果没有就会在构造函数的prototype中找,如果还没有就在向上找,这时候就是Object中找了,如果还没有,再上一级就是null了,没有就没有了。这段话很绕,你结合我上面的那个图看。

本文标题:javascript 基础攻关(二)—— 原型和原型链

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