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