原型

2021-04-28  本文已影响0人  BJ呀呀呀

1.什么是原型?

是每个一函数自带的一个属性(prototype),它的值是一个对象

2 它的作用?

可以让同一个构造函数创建的所有对象共享属性和方法.
也就是说, 你可以不在构造函数中定义对象的属性和方法,
而是可以直接将这些信息添加到原型对象中。

 function show() {
        }
        console.log(show.prototype);

 //构造函数+new
        function Person(name) {
            this.name = name;//字符串,值类型
            this.run = function () {
                console.log(`我是${this.name},我爱跑步!`);
            }
        }

        var p = new Person("刘德华")
        p.run()

        var p1 = new Person("刘德华")
        p1.run()

        console.log(p == p1);//fasle
        console.log(p.name);
        console.log(p.name==p1.name); //true
        console.log(p.run==p1.run);   //false,因为在new的时候,
                                      //构造函数内部又创建一次函数
function Person(name) {
            this.name = name;
            // this.run = function () {
            //     console.log(`我是${this.name},我爱跑步!`);
            // }
        }
        Person.prototype.run = function () {
            console.log(`我是${this.name},我爱跑步!`);
        }
        Person.prototype["show"] = function () {
        }
        var p1 = new Person("刘德华");
        var p2 = new Person("刘德华");
        console.log(p1 == p2); // fasle //2个不同的对象,在栈开辟了2个不同的空间
        console.log(p1.name == p2.name);//true //字符串比较,相等
        console.log(p1.run == p2.run); //true,p1.run和p2.run是同一个地址

原型的优缺点

往原型上添加的属性和方法,都被共享了
属性,初始化的时候不能指定

属性写到构造函数内部,方法原型里面

//属性构造函数化,方法原型化
 function Person(name, age) {
            this.name = name;
            this.age = age;
            this.family = ["芭比", '妈咪']
        }
        //属性
        // Person.prototype.name = "西门坤";
        // Person.prototype.age = 21;

        //方法
        Person.prototype.add = function (name) {
            this.family.push(name);
        }

        Person.prototype.show = function () {
            console.log(this.family);
        }

        var p1 = new Person("西门坤", "21");
        p1.add("潘金莲");


        var p2 = new Person("东门坤", "22");
        console.log(p1);
        console.log(p2);

        p1.show()

        p2.show()

当构造函数的属性与原型的属性,同时存在的时候,构造函数内部的属性优先

        function Person() {
            this.name = "项某某";
        }

        Person.prototype.name = "刘德华";
        var p = new Person();
        console.log(p.name);//项某某

写法1

function Person() {

        }
Person.prototype.run = function () { }
Person.prototype.show = function () { }
Person.prototype.eat = function () { }

//既然 Person.prototype 它是一个对象,就可以往对象里添加
 console.log(Person.prototype);

写法2

 Person.prototype = {
            constructor: Person,//构造器强行指回到构造函数
            run() { },
            show() { },
            eat() { }
        }
        Person.prototype.myname = "刘德华";

        console.log(Person.prototype);
上一篇 下一篇

猜你喜欢

热点阅读