1.this的指向问题
解析器在调用函数的时候每次都会向函数内部传递一个隐含参数。
这个参数就是this,this的指向是一个对象。
这个对象是函数执行的上下文对象。
根据函数调用的方式不同,this的指向也就不同。
1.以函数的形式调用,this的指向永远都是window。
2.以方法的形式调用,this的指向就是调用这个方法的那个对象。(即用点(.)调用的的是方法,点之前的的对象就是this的指向)
2.工厂函数
function create(name,age,sex){
let obj = new Object()
obj.name = name;
obj.age = age;
obj.sex = sex;
obj.seyName = function(){
alert(this.name)
}
return obj;
}
let obj1 = create("至尊宝",18,"男")
let obj2 = create("青霞",17,"女")
//obj1.seyName()
//obj2.seyName()
console.log(obj1)
console.log(obj2)
3.构造函数
构建一个函数来创建Person对象(Person函数是一个类)。
构建函数是习惯上首字母大写。
构建函数和普通函数没有本质上的区别,构建函数就是普通函数。只是调用方式有区别。
构建函数是通过new 的关键字调用,普通函数是直接调用。
构建函数的执行流程
1.立即创建一个新对象
2.将新建对象设置为函数中的this,在函数中可以使用this来引用新建对象
3.逐行执行函数中的代码
4.将新建对象作为返回值返回
//原型对象添加方法,原型对象相当于是Person对象(Person函数这一个类)的公共方法
//当我们访问一个对象的方法或者或者属性,它会先在对象本身去找,如果找的就会立即使用。如果没有找到就会在他的原型对象里去找,如果找到就立即使用。当我们的对象要添加一个全局的不影响命名空间的时候,我们一般都是在原型对象上添加属性或者方法
//Person.prototype.sayName = function(){
// alert("hello大家好,我是:" + this.name)
//}
//将sayName的方法在全局中定义,会污染全局的命名空间,这样定义很不安全,尤其是多人协作开发的时候,这里是举例定义的,建议在原型对象中添加
function fun() {
alert(" hello大家好,我是:" + this.name)
}
function Person(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
this.sayName = fun;
}
let obj1 = new Person("至尊宝", 18, "男")//obj1是Person对象的一个实例
let obj2 = new Person("青霞", 17, "女")//obj2是Person对象的一个实例
//obj1.seyName()
//obj2.seyName()
console.log(obj1)
console.log(obj2)
instanceof方法
使用instanceof可以检查一个对象是否为一个类的实例
语法: 对象 instanceof 构造函数
如果是则返回true,反之则是false
例:console.log(obj1 instanceof Person)
//true
所有的对象都是Object的后代,instanceof 检查都是true。
in方法
function MyClass(){
}
MyClass.prototype.name= "我在原型对象上的名字"
var mc = MyClass()
mc.age = “18”
//console.log(mc)
使用in方法可检查对象中是否含有一个属性或者方法,有就返回true,反之false,除此之外,对象没有该属性或者方法但是对象的原型上有也会返回true
例:console.log( 'name' in mc)
//true
hasOwnproperty()
使用 hasOwnproperty()方法检查对象中是否含有该属性或者方法
只有我们对象自身中含有该属性或者方法的时候才会返回true
例:console.log(mc.hasOwnproperty('age'))
//true