Fork me on GitHub

JavaScript高级复习——构造函数和原型

构造函数

JavaScript的构造函数中可以添加一些成员,可以在构造函数本身上添加,也可以在构造函数内部的this上添加。通过这两种方式添加的成员,就分别称之为静态成员和实例成员。

静态成员:在构造函数本身上添加的成员称之为静态成员,只能由构造函数本身来访问。

实例成员:在构造函数内部创建的对象成员成为实例成员,只能由实例化的对象来访问。

复制代码
// 构造函数中的属性和方法我们称为成员,成员可以添加
        function Star(uname, age) {
            this.uname = uname
            this.age = age
            // this.sing = sing
            this.sing = function () {
                console.log('我会唱歌')
            }
        }
        var ldh = new Star('刘德华', 18)
        // 1、实例成员就是构造函数内部通过this添加的成员 uname age sing就是实例成员
        // 实例成员只能通过实例化的对象来访问
        console.log(ldh.uname)
        ldh.sing()
        // console.log(Star.uname) // 不可以通过构造函数来访问实例成员
        // 2、静态成员 在构造函数本身上添加的成员 sex就是静态成员
        Star.sex = '男'
        // 静态成员只能通过构造函数来访问
        console.log(Star.sex) //
        console.log(ldh.sex) // undefined  不能通过对象来访问
复制代码

 构造函数原型对象prototype

 构造函数的问题

构造函数方法很好用,但是存在浪费内存的问题

因为实例化的多个对象拥有同样的方法,这些方法都一样(都一样指代码一样,但是这些方法指向的内存地址不一样)且每实例化一次就会新开辟一个内存地址。

 

我们希望所有的对象使用同一个函数,这样就比较节省内存,那么我们要怎么做呢?     构造函数原型对象prototype

构造函数通过原型分配的函数是所有对象所共享的。 

JavaScript规定,每一个构造函数都有一个prototype属性,指向另一个对象。注意这个prototype就是一个对象,这个对象的所有属性和方法,都会被构造函数所拥有。

我们可以把那些不变的方法,直接定义在prototype对象上,这样所有对象的实例就可以共享这些方法。

复制代码
function Star(uname, age) {
            this.uname = uname
            this.age = age
            // this.sing = function () {
            //     console.log('我会唱歌')
            // }
        }
        Star.prototype.sing = function () {
            console.log('我会唱歌')
        }
        var ldh = new Star('刘德华', 18)
        var zxy = new Star('张学友', 19)
        ldh.sing() // 我会唱歌
        zxy.sing() // 我会唱歌
        console.log(ldh.sing === zxy.sing) // true
    // 一般情况下,我们的公共属性类似uname,age这些东西 定义到构造函数里面,公共的方法放到原型对象身上。
复制代码

 

问答:

1、原型是什么?

一个对象,我们也称为prototype为原型对象。

2、原型的作用是什么?

共享方法。

对象原型__proto__

(杠杠proto杠杠,注意前后各有两根下划线)

对象都会有一个属性_proto_指向构造函数的prototype原型对象,之所以我们对象可以使用构造函数prototype原型对象的属性和方法,就是因为对象有_proto_原型的存在。

复制代码
function Star(uname, age) {
            this.uname = uname
            this.age = age
        }
        Star.prototype.sing = function () {
            console.log('我会唱歌')
        }
        var ldh = new Star('刘德华', 18)
        var zxy = new Star('张学友', 19)
        ldh.sing() // 我会唱歌
        // zxy.sing() // 我会唱歌
        console.log(ldh) // 对象身上系统自己添加一个__proto__ 指向构造函数的原型对象
        console.log(ldh.__proto__ === Star.prototype) // true
        // 方法的查找规则:首先先看ldh,对象身上是否有sing方法,如果有就执行这个对象上的sing
        // 如果没有sing这个方法,因为有__proto__的存在,就去构造函数原型对象prototype身上去查找sing这个方法
复制代码

 

__proto__对象原型和原型对象prototype是等价的
__proto__对象原型的意义就在于为对象的查找机制提供一个方向,或者说一条线路,但是它是一个非标准属性,因此实际开发中,不可以使用这个属性,它只是内部指向原型对象prototype

 

posted @   spikezz  阅读(44)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
1
点击右上角即可分享
微信分享提示