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个步骤:
- 创建一个新对象;
- 将构造函数的作用域赋给新对象,因此,this就指向了这个新对象;
- 执行构造函数中的代码,即为这个新对象添加属性、方法;
- .返回新对象。
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操作符可以确定属性是存在对象中还是原型中。