javascript基础拾遗(七)

时间:2020-12-22 23:43:13

1.对象的继承__proto__

var Language = {
        name: 'program',
        score: 8.0,
        popular: function () {
            return this.score/10*100 + '%';
        }
    }
    var Python = {
        name: 'python',
        score: 9.0
    }
    Python.__proto__ = Language
    console.log(Python.popular())

运行结果: 90%
__proto__属性将Python对象的原型指向Language对象,这样Python对象就像是从Language对象继承的一样。

2.对象继承的另一种方法Object.create()

var Language = {
        name: 'program',
        score: 8.0,
        popular: function () {
            return this.score/10*100 + '%';
        }
    }
    Python = Object.create(Language)
    Python.name = 'python'
    Python.score = 9.0
    console.log(Python.popular())

运行结果: 90%

3.原型链
当访问一个对象的属性时,javascript引擎先在当前对象上查找该属性,如果没有,就到它的原型对象上找,
如果还没有找到,就一直上溯到Object.prototype对象。
例如,创建Array对象:
var arr = [1,2,3];
其原型链是:
arr--->Array.prototype---->Object.prototype

Array.prototype定义了indexof(),shift()等方法,因此可以直接在Array对象上调用这些函数。

函数也是一个对象,它的原型链是:
foo--->Function.prototype---->Object.prototype---->null
Function.prototype定义了apply()等方法,因此所有函数都可以调用apply方法

4.构造函数

function Language(name){
        this.name = name
        this.score = 8.0
    }
    var language = new Language('python')
    console.log(language)

Language是个普通的函数,new关键字调用Language函数,并返回Language对象,默认return this,省略
Language函数this关键字也绑定到new创建的对象
原型链如下:
language--->Language.prototype---->Object.prototype--->null

language有一个属性constructor,继承自Language,指向的是Language对象本身
language.constructor == Language.prototype.constructor
Language.prototype.constructor == Lang
Object.getPrototypeOf(lang) == Lang.prototype
language instanceOf Language

function Language(name){
        this.name = name
        this.score = 8.0
        this.popular = function(){
            return this.score/10*100 + '%'
        }
    }
    var language = new Language('python')
    var language2 = new Language('C')
    console.log(language)
    // false
    console.log(language.popular == language2.popular)

language和language2的popular方法不是同一个函数,根据属性查找原则,
只需要将popular方法,添加到Language的原型上就可以了

function Language(name){
        this.name = name
        this.score = 8.0
    }
    Language.prototype.popular = function () {
        return this.score/10*100 + '%'
    }
    var language = new Language('python')
    var language2 = new Language('C')
    console.log(language)
    // true
    console.log(language.popular == language2.popular)

需要注意的,构造函数首字母应该大写,普通函数首字母小写