JS----创建对象

有关this指向问题:this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象。
对于构造函数: 如果返回值是一个对象,那么this指向的就是那个返回的对象,如果返回值不是一个对象那么this还是指向函数的实例。
参考学习:https://www.cnblogs.com/juggdxy/p/8245491.html
创建对象的六种方式:

1.字面量创建
2.new object()创建
3.工厂模式
4.构造函数模式
5.原型模式
6.混合模式

3.工厂模式:

function createPerson(name, age, job){
						var o = new Object();
						o.name = name;
						o.age = age;
						o.job = job;
						o.sayName =  function(){
						alert(this.name);
						};
						return o;
                 }
 var person1 = createPerson("lisi", 29 , "teacher");
 var person2 = createPerson("zhagnsna", 34,"doctor");

4.构造函数模式:

function Person(name,age,job) {
    this.name=name;
    this.age=age;
    this.job=job;
    this.sayName=function () {
       alert(this.name);
    }
 }

var person1=new Person('zhy',18,'SoftWare Engineer');
var person2=new Person('zhy2',19,'Doctor');

要创建Person的新实例,必须使用new操作符。如果不使用new,则属性和方法都被添加给了window对象了。
这种方式调用构造函数实际上会经历一下4个步骤:

  1. 创建一个新对象;
  2. 将构造函数的作用域赋给新对象,因此,this就指向了这个新对象;
  3. 执行构造函数中的代码,即为这个新对象添加属性、方法;
  4. .返回新对象。

5.原型模式

function Person() {
}

Person.prototype.name = "lisi";
Person.prototype.age = 21;
Person.prototype.family = ["lida","lier","wangwu"];
Person.prototype.say = function(){
    alert(this.name);
};
console.log(Person.prototype);   //Object{name: 'lisi', age: 21, family: Array[3]}

var person1 = new Person();        //创建一个实例person1
console.log(person1.name);        //lisi

var person2 = new Person();        //创建实例person2
person2.name = "wangwu";
person2.family = ["lida","lier","lisi"];
console.log(person2);            //Person {name: "wangwu", family: Array[3]}
// console.log(person2.prototype.name);         //报错
console.log(person2.age);              //21

6.混合模式

function Person(name,age,family){
    this.name = name;
    this.age = age;
    this.family = family;
}

Person.prototype = {
    constructor: Person,  //每个函数都有prototype属性,指向该函数原型对象,原型对象都有constructor属性,这是一个指向prototype属性所在函数的指针
    say: function(){
        alert(this.name);
    }
}

var person1 = new Person("lisi",21,["lida","lier","wangwu"]);
console.log(person1);
var person2 = new Person("wangwu",21,["lida","lier","lisi"]);
console.log(person2);

分割线==================================================================
创建函数 ,就会创建一个prototype属性,指向原型对象,原型对象都会自动获得一个constructor属性,这个属性是指向prototype属性所在函数的指针。
调用构造函数创建新实例,新实例内部将包含一个指针,指向构造函数的原型对象。

alert(Person.prototype.isPrototypeOf(person1));

alert(Object.getPrototypeOf(person1) == Person.prototype);

alert(person2.hasOwnProperty(“name”)); 如果是·实例属性返回true,若来自原型则返回false。
in 操作符·会在通过·对象能够·访问给定属性时返回true。
同时使用hasOwnProperty和in操作符可以确定属性是存在对象中还是原型中。

posted @ 2019-03-22 19:41  princeness  阅读(89)  评论(0编辑  收藏  举报