javascript中的原型对象

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    
    <script type="text/javascript">
        // 原型
        // 构造函数的prototype属性的值
        function Person() {
            this.name = "adfs";
        }
        // 访问原型:
        // console.log(Person.prototype);

        // 给原型添加的方法
        Person.prototype.say = function() {
            // console.log("这事原型的方法");
            console.log(this.name);
        };
        Person.prototype.name = "aaaaaaa";

        // 表示非公开的方法, 可以使用,但是 可能存在问题
        // Person.prototype._init = function() {};

        // 通过构造函数来创建对象
        var p = new Person();
        // 通过p这个实例,来访问到原型中的方法或者是属性
        p.say();
        Person.prototype.say();

        // 以下两种方式调用的区别:
        // p.say();
        // Person.prototype.say();
        // 
        // 1 通过对象来调用方法是 通过属性搜索原则找到的方法,然后再调用
        // 2 直接访问到方法,然后再调用的
        // 3 方法内部的 this 指向不同
        //         方法内部的this :谁调用的方法,this就是指向谁

        // __proto__
        // 还可以通过通向直接访问到原型
        // 只要是带有 __ 就表示非标准的属性, 不能不再实际项目中使用
        // 有些框架中写的方法的名字也带有下划线: 
        //         表示这些方法是再框架内部使用的
        //         如果,你拿来使用,出问题了,框架不负责
        // p.__proto__
        console.log(Person.prototype === p.__proto__); // true

        // 构造函数的prototype属性 和 对象的__proto__表示的就是同一个对象
        // 只不过是 通过不同的方法来访问这个对象(原型)
        p.__proto__.say();
        // console.log(p.__proto__);

        // 两个术语:
        // prototype 原型属性
        // __proto__ 原型对象

        // 就好比是 o1和o2是两个变量,但是这两个变量就是同一个对象
        // var o1 = {};
        // var o2 = o1;
    </script>
</body>
</html>
原文地址:https://www.cnblogs.com/lsy0403/p/5928967.html