【JavaScript笔记】JavaScript基础_this和原型(7)

这里整理了函数中this和原型使用方法。

<!DOCType html>
<html>

<head>
    <meta charset="utf-8">
    <title></title>
    <script type="text/javascript">
        console.log("--------------------this--------------------");

        //this是函数里的隐含参数,指向函数执行时的上下文对象。
        //根据调用方式不一样,this会指向不同对象,
        //一般函数指向 window, 方法指向调用对象。
        function fun() {
            console.log(this);
        }

        var obj = {
            name: "张三",
            age: 18,
            sayThis: fun
        };

        fun();//Window {...}
        obj.sayThis(); //{name: '张三', age: 18, sayThis: ƒ fun()}
        console.log(obj.sayThis == fun); // true

    
        //简单的工厂方法创建类,一般不这么用,一般会用下面你的构造函数方法
        function CreatePerson(name, age) {
            var obj = new Object();
            obj.name = name;
            obj.age = age;
            obj.sayThis = fun;
            return obj;
        }

        var per1 = CreatePerson("张一", 18);
        var per2 = CreatePerson("张二", 20);
        console.log("per1:", per1); //{name: '张一', age: 18, sayThis: ƒ fun()}
        console.log("per2:", per2); //{name: '张二', age: 20, sayThis: ƒ fun()}

        console.log("--------------------构造函数--------------------");
        //使用构造函数创建类
        /*
            1.使用new 创建一个对象
            2.将新建的对象设置为函数中的this
            3.执行函数中的代码
            4.将新建对象作为返回值返回
        */
        function Person(name, age) {
            this.name = name;
            this.age = age;
            this.sayHello = function () {
                console.log("Hello");
            }
            this.sayName = sayName;
        }


        function sayName() {
            console.log("我叫:" + this.name);
        }

        var person = new Person();
        //使用instanceof判断是否是Person类的实例
        console.log(person instanceof Person); //true

        var person1 = new Person();
        var person2 = new Person();
        console.log(person1.sayHello == person2.sayHello); //false
        console.log(person1.sayName == person2.sayName); //true

        console.log("--------------------原型prototype--------------------");
        //直接声明function会污染全局变量,不知道下一段代码里有人又声明了相同的function覆盖掉
        //这时候使用prototype模式, 他是每个Object都有的隐含的属性,他会自动指向自己的prototype对象(原型对象)
        console.log(person.__proto__ == Person.prototype); //true

        //原型中添加属性
        Person.prototype.a = 123;
        console.log(person.a); //123
        console.log(person1.a); //123

        //当原型和实例都存在的时候
        person.a = "abc";
        console.log(person.a); //abc  先在自己实例中的a属性,如果没有再去找prototype中的a属性
        console.log(person1.a); //123

        //查看属性存不存在、
        Person.prototype.gender = "男";
        console.log("gender" in person); //true 也是先找自己,再找prototype
        console.log(person.hasOwnProperty("gender")); //false 只查看自己,不看prototype

        //存在这多层的prototype原型
        console.log(person.__proto__.hasOwnProperty("hasOwnProperty")); //false
        console.log(person.__proto__.__proto__.hasOwnProperty("hasOwnProperty")); //true
        console.log(person.__proto__.__proto__.__proto__); //null 一般2层的prototype

        console.log("--------------------toString--------------------");
        
        var person4 = new Person("张四",14);
        console.log(person4); //Person {name: '张四', age: 14, sayHello: ƒ(), sayName: ƒ sayName()}
        console.log(person4.toString()); //[object Object]
        console.log(person.__proto__.__proto__.hasOwnProperty("hasOwnProperty")); //true

        Person.prototype.toString = function () {
            return "Person[name = " + this.name + ", age = " + this.age + "]";
        }
        console.log(person4); //Person {name: '张四', age: 14, sayHello: ƒ(), sayName: ƒ sayName()}
        console.log(person4.toString()); //[object Object]

        console.log("--------------------gc--------------------");

        var obj = new Object();
        obj = null; //退内存里的对象值成为了垃圾对象,会被回收

    </script>
</head>

<body>
</body>

</html>

欢迎大家的意见和交流

email: li_mingxie@163.com