JavaScript原型

213 阅读2分钟

最近面试,JavaScript原型每次都问,从一开始的支支吾吾到后面疯狂跟面试官对线。

先给出面试标准答案

10. JavaScript 原型,原型链? 有什么特点?

 在 js 中我们是使用构造函数来新建一个对象的,每一个构造函数的内部都有一个 prototype 属性值,这个属性值是一个对
 象,这个对象包含了可以由该构造函数的所有实例共享的属性和方法。当我们使用构造函数新建一个对象后,在这个对象的内部
 将包含一个指针,这个指针指向构造函数的 prototype 属性对应的值,在 ES5 中这个指针被称为对象的原型。一般来说我们
 是不应该能够获取到这个值的,但是现在浏览器中都实现了 __proto__ 属性来让我们访问这个属性,但是我们最好不要使用这
 个属性,因为它不是规范中规定的。ES5 中新增了一个 Object.getPrototypeOf() 方法,我们可以通过这个方法来获取对
 象的原型。

 当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么它就会去它的原型对象里找这个属性,这个原型对象又
 会有自己的原型,于是就这样一直找下去,也就是原型链的概念。原型链的尽头一般来说都是 Object.prototype 所以这就
 是我们新建的对象为什么能够使用 toString() 等方法的原因。

 特点:

 JavaScript 对象是通过引用来传递的,我们创建的每个新对象实体中并没有一份属于自己的原型副本。当我们修改原型时,与
 之相关的对象也会继承这一改变。

详细资料可以参考: 《JavaScript 深入理解之原型与原型链》

从应用角度理解原型(这里用了jQuery源码的例子,带你手敲一个小型jq)

JavaScript

function $(obj){
    return new $.prototype.init(obj)
}
$.prototype = {
    init:function(obj){
        let dom = document.getElementById(obj)
        this.dom = dom
    },
    text(obj){
        this.dom.innerText = obj
    },
    css(obj){
        if(obj.hasOwnProperty('color')){
            this.dom.style.color = obj.color
        }
        if(obj.hasOwnProperty('width')){
            this.dom.style.width = obj.width
        }
        if(obj.hasOwnProperty('backgroundColor')){
            this.dom.style.backgroundColor = obj.backgroundColor
        }
    }
}

$.prototype.init.prototype = $.prototype //让init的原型指向$的原型

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>代码示例</title>
    <link rel="stylesheet" href="index.css">
</head>
<body>
    <div id="ha"></div>
    <script src="./index1.js"></script>
    <script>
        $('ha').text("这是自己写的jq原型")
        $('ha').css({
            color: 'red' ,
            width: '2000px',
            backgroundColor: 'yellow'
        })
    </script>
</body>
</html>