js的原型

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 一://定义类
        // function Person(name, sex, age) {
        //     this.name = name;
        //     this.sex = sex;
        //     this.age = age;
        //     //创建一个方法可以显示姓名
        //     /**
        //      * 结论:
        //      *    在构造函数中,为this添加方法,会让每一个实例单独存储一份
        //      *    即使方法的实现是一样的,但实例中的函数不会是同一个
        //      *    没有必要让,两个或多个在实例中一样的函数,占用多个存储空间
        //      *  解决方案:
        //      *     一:将函数定义在外面
        //      * **/
        //     // this.getName = function () {
        //     //     console.log('姓名:' + this.name);
        //     // }
        //     //一.1:
        //     this.getName = getName;
        // }
        // //一.2:
        // function getName() {
        //     console.log('姓名:' + this.name);
        // }
        // //创建人
        // var p1 = new Person('小白', '男', 20);
        // var p2 = new Person('小红', '女', 20);
        // p1.getName();//姓名:小白
        // p2.getName();//姓名:小红
        // console.log(p1, p2, p1.getName() === p2.getName());//true

        //二: //定义类
        // function Person(name, sex, age) {
        //     this.name = name;
        //     this.sex = sex;
        //     this.age = age;
        //     //创建一个方法可以显示姓名
        //     /**
        //      * 结论:
        //      *      在构造函数中,为this添加方法,会让每一个实例单独存储一份
        //      *      即使方法的实现是一样的,但实例中的函数不会是同一个
        //      *      没有必要让,两个或多个在实例中一样的函数,占用多个存储空间
        //      *  解决方案:
        //      *     一:将函数定义在外面
        //      *        问题:把方法放在全局,会污染全局作用域
        //      *     二:将全局的方法,放在对象中,减少全局变量
        //      *     三:在全局变量中,一个变量都不定义
        //      *         我们可以将obj对象作为属性存储在构造函数上
        //      * **/
        //     //二.1:
        //     this.getName = obj.getName;
        //     this.getSex = obj.getSex;
        //     this.getAge = obj.getAge;
        // }
        // //二.2
        // var obj = {
        //     getName: function () {
        //         console.log('姓名:' + this.name);
        //     },
        //     getSex: function () {
        //         console.log('性别:' + this.sex);
        //     },
        //     getAge: function () {
        //         console.log('年龄:' + this.age);
        //     }
        // }
        // //创建人
        // var p1 = new Person('小白', '男', 20);
        // var p2 = new Person('小红', '女', 18);
        // // p1.getName();
        // // p2.getAge('小红', '女', 20);
        // //👇法一、法二:皆为true,t,t
        // console.log(p1.getSex() === p2.getSex(), p1.getName() === p2.getName());

        // //三:定义类
        // function Person(name, sex, age) {
        //     this.name = name;
        //     this.sex = sex;
        //     this.age = age;
        //     //创建一个方法可以显示姓名
        //     /**
        //      * 结论:
        //      *      在构造函数中,为this添加方法,会让每一个实例单独存储一份
        //      *      即使方法的实现是一样的,但实例中的函数不会是同一个
        //      *      没有必要让,两个或多个在实例中一样的函数,占用多个存储空间
        //      *  解决方案:
        //      *     一:将函数定义在外面
        //      *       问题:把方法放在全局,会污染全局作用域
        //      *     二:将全局的方法,放在对象中,减少全局变量
        //      *     三:在全局变量中,一个变量都不定义
        //      *         我们可以将obj对象作为属性存储在构造函数上
        //      *       问题:Person会耦合,外部函数名和内部的指向名 
        //      **/
        //     //三.1:
        //     this.getName = Person.obj.getName;
        //     this.getSex = Person.obj.getSex;
        //     this.getAge = Person.obj.getAge;
        // }
        // //三.2
        // Person.obj = {
        //     getName: function () {
        //         console.log('姓名:' + this.name);
        //     },
        //     getSex: function () {
        //         console.log('性别:' + this.sex);
        //     },
        //     getAge: function () {
        //         console.log('年龄:' + this.age);
        //     }
        // }
        // //创建人
        // var p1 = new Person('小白', '男', 20);
        // var p2 = new Person('小红', '女', 18);
        // // p1.getName();
        // // p2.getAge('小红', '女', 20);
        // //👇法一、法二:皆为true,t,t
        // console.log(p1, p2);
        // console.log(p1.getSex() === p2.getSex(), p1.getName() === p2.getName());

        //四:原型
        /**
         * js为构造函数提供了 原型对象 :prototype,
         *    这是函数天生存在的,并且它是一个对象,可以存储数据和方法
         *    原型对于普通函数没有意义,即无法使用
         *      但是对于构造函数而言,
         *          每一个构造函数的实例化对象都可以访问原型中的属性与方法
         *          每一个构造函数都有一个隐藏的属性指向该原型对象
         *             通过 __proto__ 属性来访问原型对象
         *      原型对象就像一个公用的区域,所有的实例化对象都可以直接访问。
         *    在创建构造函数时,可以将 所有的方法与数据 ,写在原型对象中,
         *        这样方法不会污染全局作用域,每一个实例化对象都可以访问
         *        每一个实例化对象访问一个属性或方法时,会率先自身查找,有的化使用自身的;没有的化,去原型对象中查找
         * 
         * 原型对象的作用:为实例化对象共享方法与属性
         * **/

        function Person(name, sex, age) {
            this.name = name;
            this.sex = sex;
            this.age = age;
        }
        //四.1 直接为原型对象添加属性,让实例共享
        Person.prototype.getName = function () {
            console.log('姓名:' + this.name);
        }
        Person.prototype.getSex = function () {
            console.log('性别:' + this.sex);
        }
        Person.prototype.getAge = function () {
            console.log('年龄:' + this.age);
        }
        //创建人
        var p1 = new Person('小白', '男', 20);
        var p2 = new Person('小红', '女', 18);
        p1.getName();//姓名:小白
        p1.getSex();//男
        p2.getAge();//年龄:18
        console.log(p1, p2);
        //👇 皆为true,t,t
        console.log(p1.getSex() === p2.getSex(), p1.getName() === p2.getName());
    </script>
</body>

</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值