this,创建一个对象

转载于网络

this

  1. this是一个对象
  2. 他的值随着代码的运行而改变
  3. 到处都有this
  4. 不能手动改变this,不能出现在=的左边

    this出现在函数的外部
    this 指向window
    this出现在函数的内部
    若this出现在对象方法的内部那么就指向这个对象
    若不是方法的内部而只是普通函数的内部仍然指向window
    若用构造函数创建一个对象,那么构造函数中的this就指向生成的对象
    通过call/apply来修改函数中的this指向

字面量

var obj = {
    name: 'hanker',
    speak: function(){
        return 'hello ' + this.name;
    },
    age: 20
}
  1. 属性之间没有顺序的分别
  2. 方法直接访问该对象的属性和方法前要加this
  3. 属性名字可以加”,’也可以不加
  4. 也可以先定义一个空对象,然后给这个空对象添加属性和方法
var obj = {};
obj.name = 'hanker';
obj.age = 20
obj.speak = function(){
    return 'hello ' + this.name;
}

上面要访问该对象的属性要使用this.name来获得hanker

优点:简单
缺点:不能批量生成

工厂模式

思想:用一个函数来初始化一个空对象

    function createObj(w,h){
        var obj = {};
        obj.width = w;
        obj.height = h;
        obj.getArea = function(){
            return this.width * this.height;
        }
        return obj;
    }
    console.log(createObj(10,10).getArea());//100

优点:快速创建对象
缺点:生产的对象缺少标识符

    function createObj(w,h){
        var obj = {};
        obj.width = w;
        obj.height = h;
        obj.getArea = function(){
            return this.width * this.height;
        }
        return obj;
    }
    var r1 = createObj(10,10);
    var r2 = createObj(20,20);
    console.log(r1.constructor);//function Object() { [native code] }
    console.log(r2.constructor);//function Object() { [native code] } 没有分开两个对象

构造器

    function F(name,age){//构造器一般首字母大写
        this.name = name;
        this.age = age;
        this.speak = function(){
            return this.name +' '+ this.age;
        }
    }
    var me = new F('hanker',20); // 首先会执行一下 F();
    console.log(me.speak()); // hanker 20
    console.log(me.constructor); // F

过程

  1. 创建一个空对象 var obj = {};
  2. F.apply(obj,[augument]);
  3. obj.proto == F.prototype;
  4. 返回obj

优点:

  1. 简单
  2. 有标志符
  3. 面向对象思想

缺点:
它的自有属性(特别一些方法)会重复。如下:每个对象都有一个speak方法。而这个方法显然应该是全体的对象都有的,而不需要每一个对象都有一个。这样会造成空间的浪费。

原型方式创建对象

function F(name,age){
        this.name = name;
        this.age = age;
    }
    F.prototype.speak = function(){
        return this.name +' ' + this.age;
    }
    var me = new F('hanker',20); // 首先会执行一下 F();
    var you = new F('xxx', 21);
    console.log(me.speak()); // hanker 20
    console.log(you.speak()); // xxx 21
    console.log( you.__proto__ == me.__proto__); // true

注意:

  1. 把每个对象用的方法放在原型中
  2. 创建对象的时候必须加上new,不然只会调用一下函数,函数中的this指向window

原型属性和对象自有属性

    function Reat(){
        this.width = 100;
        this.height = 100;
    }
    Reat.prototype.name = 'juxing'

name这个属性是每个new Reat都有的属性
width 自有属性,每一个对象自己的属性

相同点:
每一个对象都可以访问
不同点:
修改对象的原型每个对象都会受到影响

    function Reat(x,y){
        this.width = x;
        this.height = y;
    }
    Reat.prototype.name = 'juxing'
    var f1 = new Reat(10,20);
    var f2 = new Reat(100,200);
    f1.name = 'f1 juxing';
    console.log(f1.name); // f1 juxing
    console.log(f2.name);// juxing
    f1.__proto__.name = 'f1 juxing';
    console.log(f1.name);// f1 juxing
    console.log(f2.name);// f1 juxing

过程
当f1.name首先去寻找自有属性,如果没有则通过原型链去找
如果通过f1.proto.name去修改则所有通过Reat来创建的对象的原型链上的name都被修改了
如果f2本身没有自有的name属性,那么就向上寻找原型链中的name属性

注意:
console.log(f1.hasOwnProperty(‘name’)); // true
console.log(f2.hasOwnProperty(‘name’)); //false
在原型链上的属性可以通过hasOwnProperty来查询

for(var p in f1){
    console.log(p); //width height name
}
for(var p in f2){
    console.log(p); //width height name
}

通过for in 能遍历出自有属性和原型属性

同理原型方法和自有方法

在 JavaScript 中,创建对象的方式多种多样,每种方式都有其特点和适用场景。以下是常见的创建对象的方法: ### 构造函数模式 构造函数模式是一种常用的方式,通过定义一个构造函数并使用 `new` 关键字来创建对象实例。构造函数内部使用 `this` 来绑定属性和方法到实例上。例如: ```javascript function Person(name, age) { this.name = name; this.age = age; this.sayHello = function() { console.log("Hello, I'm " + this.name); }; } var person1 = new Person("Alice", 25); person1.sayHello(); // 输出: Hello, I'm Alice ``` 这种方式可以创建多个具有相同属性和方法的对象实例[^3]。 ### 原型模式 原型模式通过为构造函数的原型对象添加属性和方法来实现共享的属性和方法。所有实例共享原型对象上的属性和方法。例如: ```javascript function Person(name, age) { this.name = name; this.age = age; } Person.prototype.sayHello = function() { console.log("Hello, I'm " + this.name); }; var person1 = new Person("Alice", 25); person1.sayHello(); // 输出: Hello, I'm Alice var person2 = new Person("Bob", 30); person2.sayHello(); // 输出: Hello, I'm Bob ``` 原型模式可以避免每个实例都创建相同的属性和方法,节省内存[^1]。 ### 工厂模式 工厂模式通过定义一个工厂函数创建对象,隐藏了对象创建的细节。例如: ```javascript function createPerson(name, age) { var person = new Object(); person.name = name; person.age = age; person.sayHello = function() { console.log("Hello, I'm " + this.name); }; return person; } var person1 = createPerson("Alice", 25); person1.sayHello(); // 输出: Hello, I'm Alice ``` 工厂模式适用于需要创建多个相似对象的情况,简化了对象创建过程[^1]。 ### 混合模式 混合模式结合了构造函数模式和原型模式的优点,通过构造函数定义实例属性,通过原型定义共享的方法。例如: ```javascript function Person(name, age) { this.name = name; this.age = age; } Person.prototype.sayHello = function() { console.log("Hello, I'm " + this.name); }; var person1 = new Person("Alice", 25); person1.sayHello(); // 输出: Hello, I'm Alice ``` 混合模式解决了构造函数模式和原型模式各自的缺点,是创建对象的一种常用方式[^1]。 ### 动态原型模式 动态原型模式在构造函数中通过检查某个方法是否存在来决定是否初始化原型。例如: ```javascript function Person(name, age) { this.name = name; this.age = age; if (typeof this.sayHello !== 'function') { Person.prototype.sayHello = function() { console.log("Hello, I'm " + this.name); }; } } var person1 = new Person("Alice", 25); person1.sayHello(); // 输出: Hello, I'm Alice ``` 动态原型模式允许在构造函数内部动态地添加原型方法,保持了构造函数和原型的独立性[^1]。 ### 寄生构造函数模式 寄生构造函数模式通过在构造函数内部创建一个对象并返回,而不是使用 `new` 关键字。例如: ```javascript function Person(name, age) { var person = new Object(); person.name = name; person.age = age; person.sayHello = function() { console.log("Hello, I'm " + this.name); }; return person; } var person1 = new Person("Alice", 25); person1.sayHello(); // 输出: Hello, I'm Alice ``` 寄生构造函数模式适用于需要创建特定类型对象的情况,但不推荐使用这种方式创建对象[^1]。 ### 类(ES6)模式 随着 ES6 的引入,可以使用类来创建对象,虽然在底层仍然是基于原型机制工作的。例如: ```javascript class Person { constructor(name, age) { this.name = name; this.age = age; } sayHello() { console.log("Hello, I'm " + this.name); } } var person = new Person("John", 30); person.sayHello(); // 输出: Hello, I'm John ``` 类模式提供了更简洁的语法,并且支持继承和静态方法等特性[^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值