js创建对象

    // 1、字面量创建
    var per1 = {
        name: '张三',
         age: '18',
         eat: function () {
            console.log('吃东西')
        }
    }
    // 2、Object方式创建
    var per2 = new Object()
    per2.name = '李四';
    per2.age = '18';
    per2.read = function () {
        console.log('读书')
    }
    // 3、通过工厂模式创建
    function person(name,age) {
        var obj = new Object();
        obj.name = name;
        obj.age  = age;
        obj.play = function () {
            console.log('玩游戏')
        }
        return obj
    }
    var per3 = person('王五','20')
   // 4、通过构造函数创建
    function animal(name, age) {
        this.name = name;
        this.age = age;
        this.food = function () {
            console.log('骨头')
        }
    }
    var ani1 = new animal('泰迪',3) // ani1称为实例化对象
    console.log(ani1.__proto__ === animal.prototype) // true 两者都是指向构造函数的原型
    console.log(ani1.__proto__.constructor === animal.prototype.constructor) //  true 两者都指向的是构造函数
    console.log(ani1 instanceof animal) // true 以此来判断对象是不是这种数据类型
JS面向对象
构造函数的执行流程:
1、立刻创建一个新的对象
2、将新建的对象设置为函数中的this
3、逐行执行函数中的代码
4、将新建的对象作为函数值返回
使用同一个构造函数创建的对象,我们成为一类对象,也将一个构造函数成为一个类,
我们将通过一个构造函数创建的对象,称之为该类的实例

1、当以函数的形式调用时,this是window
2、当以方法的形式调用时,谁调用方法this就是谁
3、当以构造函数的形式调用时,this就是新创建的那个对象

提升系统性能,不管实例化多少次对象,这个函数都只会调用一次,如果是写在构造函数内,则
每一个实例化时都会调用。 但是这样就将函数定义在了全局作用域中,污染了全局作用域的命名
空间,而且在全局作用域中也很不安全(通过原型链的方式向原型中添加fun方法可以保证函数不在全局作用域中,且只会执行一次)

JS原型(prototype)
我们所创建的每一个函数,解析器都会向函数中添加一个属性prototype
这个属性对应着一个对象,这个对象就是我们所谓的原型对象
当函数以构造函数调用时,所创建的对象中都会有一个隐藏的属性执行该构造函数的原型对  象
原型对象就相当于一个公共的区域,所有同一个类的实例都可以访问这个原型对象
我们可以将对象中共有的内容,统一设置到原型对象中。
当我们访问对象的一个属性或方法时,它会先在对象自身中寻找,如果有则直接使用
没有则会通过__proto__向原型对象中找,如果还是没有,则会在原型的原型上找,一直向上,一直找到object对象原型中(最终),如果有则返回,如果没有则返回undefined
以后我们创建构造函数时,可以将这些对象共有的属性和方法,统一添加到构造函数的原型对象中,这样不用分别为每一个对象添加,也不会影响到全局作用域,就可以使每个对象都具有这些属性和方法了



 function  Person(name,age) {
     this.name = 'name';
     this.age = 'age';
     this.say=function () {
         console.log(this.name)
     }
 }
var obj = new Person('aa',18);
 Person.prototype.sex = 'man';
 console.log(obj.sex)//man

 

posted @ 2019-05-17 15:54  陈小作  阅读(2701)  评论(0编辑  收藏  举报