例子:创造一个对象
function Person(first, last, age, gender, interests) {
this.name = {
first,
last
};
this.age = age;
this.gender = gender;
this.interests = interests;
this.bio = function() {
alert(this.name.first + ' ' + this.name.last + ' is ' + this.age + ' years old. He likes ' + this.interests[0] + ' and ' + this.interests[1] + '.');
};
this.greeting = function() {
alert('Hi! I\'m ' + this.name.first + '.');
};
};
创建Object的四种方法:
1、直接建立:
var person = {
name: ['Bob', 'Smith'],
age: 32,
gender: 'male',
interests: ['music', 'skiing'],
bio: function() {
alert(this.name[0] + ' ' + this.name[1] + ' is ' + this.age + ' years old. He likes ' + this.interests[0] + ' and ' + this.interests[1] + '.');
},
greeting: function() {
alert('Hi! I\'m ' + this.name[0] + '.');
}
};
2、通过构造器函数:(最上面的例子)
3、通过Object()的构造器:
var person1 = new Object();
或
var person1 = new Object({
name : 'Chris',
age : 38,
greeting : function() {
alert('Hi! I\'m ' + this.name + '.');
}
});
4、使用create()方法:(基于一个已经存在的对象创建另一个对象。)
var person2 =
Object.create(person1);
注意:此时person2就是拷贝了一个person1,它里面的属性和方法都一样。
在传统的 OOP 中,首先定义“类”,此后创建对象实例时,类中定义的所有属性和方法都被复制到实例中。在 JavaScript 中并不如此复制——而是在对象实例和它的构造器之间建立一个连接(作为原型链中的一节),以后通过上溯原型链,在构造器中找到这些属性和方法。
当我们调用person1中的valueOf()方法时,发生什么呢:
person1.valueOf()
- 浏览器首先检查,
person1
对象是否具有可用的valueOf()
方法。 - 如果没有,则浏览器检查
person1
对象的原型对象(即Person
)是否具有可用的valueof()
方法。 - 如果也没有,则浏览器检查
Person()
构造器的原型对象(即Object
)是否具有可用的valueOf()
方法。Object
具有这个方法,于是该方法被调用,
----------------------------------------------------------------------------------------------------------------------------------------
1、prototype 属性:在此处定义被继承的成员:
prototype
属性之上的——那些以 Object.prototype.
开头的属性,
Object.
开头的属性。prototype
属性的值是一个对象,我们希望被原型链下游
Person.prototype.farewell = function() {
alert(this.name.first + ' has left the building. Bye for now!');
}
Person.prototype.fullName = this.name.first + ' ' + this.name.last;
var Person=function(name,age){ this.name=name; this.age=age; } var person1=new Person("tomb",25); var person2=Object.create(person1); console.log(person1.__proto__);------结果是Person对象 console.log(person2.__proto__);------结果是person1对象。
----------------------------------------------------------------------------------------------------------------------------------------
var Person=function(name,age){ this.name=name; this.age=age; } var person1=new Person("tomb",25); var person2=Object.create(person1); console.log(person1.constructor);------结果是Person()构造器 console.log(person2.constructor);------结果任然是Person()构造器
var person3 = new person1.constructor('Karen', 'Stephenson', 26, 'female', ['playing drums', 'mountain climbing']);
----------------------------------------------------------------------------------------------------------------------------------------
// 构造器及其属性定义
function Test(a,b,c,d) {
// 属性定义
};
// 定义第一个方法
Test.prototype.x = function () { ... }
// 定义第二个方法
Test.prototype.y = function () { ... }
// 等等……
----------------------------------------------------------------------------------------------------------------------------------------
function Teacher(first, last, age, gender, interests, subject) {
Person.call(this, first, last, age, gender, interests);
this.subject = subject;
}
Teacher.prototype = Object.create(Person.prototype);
第三步:设置constructor属性:(不设置,有可能会出错)
Teacher.prototype.constructor = Teacher;