JavaScript构造函数详解
1、构造函数就是初始化一个实例对象,对象的prototype属性是继承一个实例对象。
2、构造函数的三大特点:
a:构造函数的函数名的第一个字母通常大写。
b:函数体内使用this关键字,代表所要生成的对象实例。
c:生成对象的时候,必须使用new命令来调用构造函数。
3、注意事项:
a:默认函数首字母大写
b:构造函数并没有显示返回任何东西。new操作符会自动创建给定的类型并返回他们,当调用构造函数时,new会自动创建this对象,且类型就是构造函数类型。
c:也可以在构造函数中显示调用return,如果返回的值是一个对象,它会代替新创建的对象实例返回。如果返回的值是一个原始类型,它会被忽略,新创建的实例会被返回。
<script>
function Person(name){
this.name = name
}
var p1 = new Person(‘john‘)
console.log(p1)
function person(name){
var obj = new Object()
obj.name = name
return obj
}
var p2 = person(‘john‘)
console.log(p2)
p1:Person{name:’john’}
P2:{name:’john’}
</script>
4、new命令
new命令的作用,就是执行一个构造函数,并且返回一个对象实例。使用new
命令时,它后面的函数调用就不是正常的调用,而是依次执行下面的步骤。
a:创建一个空对象,作为将要返回的对象实例。
b:将空对象的原型指向了构造函数的prototype属性。
c:将空对象赋值给构造函数内部的this关键字。
d:开始执行构造函数内部的代码。
也就是说,构造函数内部,this指向的是一个新生成的空对象,所有针对this的操作,都会发生在这个空对象上。构造函数之所谓构造函数,意思是这个函数的目的就是操作一个空对象(即this对象),将其构造为需要的样子。
以上是new命令的基本原理,这个很重要。以下会用具体实例来验证该原理的过程。
new命令的作用,就是调用一个构造函数,并且返回一个对象实例。
5、因为构造函数也会是函数,所以可以直接被调用,但是它的返回值为undefine,此时构造函数里面的this对象等于全局this对象。this.name其实就是创建一个全局的变量name。在严格模式下,当你不通过new调用Person构造函数会出现错误。
6、也可以在构造函数中用Object.defineProperty()方法来帮助我们初始化;
<script>
function Person(){
Object.defineProperty(this,‘name‘,{
get:function(){
return name;
},
set:function(newName){
name=newName
},
enumerable:true,
configurable:true
})
}
var p1=new Person(‘John‘)
console.log(p1)
7、在构造函数中使用原型对象
使用字面量形式改写了原型对象改变了构造函数的属性,因此他指向Object而不是Person。这是因为原型对象具有一个constructor属性,这是其他对象实例所没有的。当一个函数被创建时,它的prototype属性也被创建,且该原型对象的constructor属性指向 该函数。当使用对象字面量形式改写原型对象时,其constructor属性将被置为泛用对象Object.为了避免这一点,需要在改写原型对象的时候手动重置constructor
8、var Book = function(name, price) {
this.name = name;
this.price = price;
}
var java = new Book(‘Master Java‘, 82);
当使用new关键字来调用构造函数时,执行上下文从全局变量对象(window)变成一个空的上下文,这个上下文代表了新生成的实例。因此,this关键字指向当前创建的实例。
默认情况下,如果你的构造函数中没有返回任何内容,就会返回this----当前的上下文,也就是你当前创建的对象。要不然就返回任意非原始类型的值。而普通的函数如果没有明显的返回值将返回undefined。
9、在JavaScript构造函数中:如果return值类型,那么对构造函数没有影响,实例化对象返回空对象; 如果return引用类型(数组,函数,对象),那么实例化对象就会返回该引用类型;
原文:https://www.cnblogs.com/yqyf/p/12331107.html