javascript创建对象:
组合使用构造函数模式和原型模式
function Person(name, age) {
this.name = name,
this.age = age,
this.friends = ["hanmei", "lileilei"]
}
Person.prototype = {
constructor: Person,
sayName: function () {
alert("hello world")
}
}
var p = new Person;
var t = new Person;
p.friends.push("DIdi")
console.log(p.friends)// ["hanmei", "lileilei", "DIdi"]
console.log(t.friends)// ["hanmei", "lileilei"]
实例属性在构造函数中定义,而实例共享的属性constructor和方法则是在原型中定义的。
构造函数与原型混成的模式,是定义引用类型的一种默认模式
关于Js原型和原型链
可参考
https://www.jianshu.com/p/dee9f8b14771
https://www.jianshu.com/p/652991a67186
https://www.jianshu.com/p/a4e1e7b6f4f8
以下取自javascript高级程序设计第三版
我们创建的每个函数,都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。
换句话说,不必再构造函数中定义对象实例的信息,而是可以将这些信息直接添加到原型对象中,如下例
function Person(){}
Person.prototype.name = "Lenerd"
Person.prototype.age=38
Person.prototype.sayName=function(){
alert(this.name)
}
var p=new Person;
var t=new Person;
console.log(Person.prototype)//{name: "Lenerd", age: 38, sayName: ƒ, constructor: ƒ}
console.log(t.__proto__==Person.prototype)//(2)true
alert(Person.prototype.isPrototypeOf(t))//(3)true
console.log(Person.prototype.isPrototypeOf(p)))//(4)true
console.log(p.hasOwnProperty("name"))//(5)false,自定义后,如p.name="ladygg"才是true
- Person.prototype.constructor指向Person
- 创建实例后,实例内部将包含一个指针proto,改指针指向构造函数的原型对象。
- 原型对象.isPrototypeOf()方法,确定对象间的关系。
- Object.getPrototypeOf(实例),返回原型对象
- 实例.hasOwnProperty(“属性”),判断该属性是否为原型属性
除了这些还有in操作符,无论是对象属性,还是原型对象属性:
alert(“name” in p)//true
还有hasPrototypeProperty(p,’name’)//true判断该属性是否继承自原型的属性。