js中可以这样定义对象吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js中可以这样定义对象吗?相关的知识,希望对你有一定的参考价值。
就是将cat.prototype.showName放在函数体内。
function cat(color,name)
animal.apply(this,arguments);
this.color=color;
this.name=name;
cat.prototype.showName=function()
console.log("the name is"+this.name);
我以前碰到的写法都是
function cat(color,name)
animal.apply(this,arguments);
this.color=color;
this.name=name;
cat.prototype.showName=function()
console.log("the name is"+this.name);
可是今天碰到第一种写法竟然没有报错,不知道为什么,如果第一个写法没有什么问题,那么js中经典的动态原型写法不就是多此一举吗?
动态原型写法是:
<html>
<body>
<script type="text/javascript">
function Car(sColor,iDoors,iMpg)
this.color = sColor;
this.doors = iDoors;
this.mpg = iMpg;
this.drivers = new Array("Mike","John");
if (typeof Car._initialized == "undefined")
Car.prototype.showColor = function()
alert(this.color);
;
Car.prototype.showDoors = function()
alert(this.doors);
;
Car._initialized = true;
var oCar1 = new Car("red",4,23);
var oCar2 = new Car("blue",3,25);
oCar1.drivers.push("Bill");
document.write(oCar1.drivers);
document.write("<br />")
document.write(oCar2.showDoors());
</script>
</body>
</html>
当初就是为了将prototype内的东西写进函数体内,设计了动态原型写法。这不是和第一种写法一样了吗?第一种写法为什么没有出现错误呢?
1. 基于已有对象扩充其对象和方法(只适合于临时的生成一个对象):
var obj = new Object();
obj.name="userObject";
obj.printName = function(name)
this.name = name;
alert(this.name);
obj.printName("newUserObject");
2.工厂方式创建对象(每次创建一个object后,其中对应的方法(本例中是get)也被创建一次,方法不能被所创建的所有对象(本例中是obj1和obj2)共享):
a.
function createObject()
var obj = new Object();
obj.name="userObject";
obj.password = "12345";
obj.get = function()
alert(this.name + ", " + this.password);
return obj;
var obj1 = createObject();
var obj2 = createObject();
obj1.get();
obj2.get();
b.带参数的构造方法:
function createObject(username,password)
var obj = new Object();
obj.username = username;
obj.password = password;
obj.get = function()
alert(this.username + ", " + this.password);
return obj;
var obj1 = createObject("zhangsan","123456");
obj1.get();
c.让函数被多个创建的对象所共享,而不是每一个对象都创建一个相同的函数(缺点:对象定义本身和方法分离了):
function get()
alert(this.username + ", " + this.password);
function createObject(username,password)
var obj = new Object();
obj.username = username;
obj.password = password;
obj.get = get;
return obj;
var obj1 = createObject("zhangsan","123456");
var obj2 = createObject("lisi","54321");
obj1.get();
obj2.get();
3.构造函数方式:
a.
function Person()
this.username = "zhangsan";
this.password = "123";
this.getInfo = function()
alert(this.username + ", " + this.password);
var person = new Person();
person.getInfo();
b.可以在构造函数是传递参数:
function Person(username,password)
this.username = username;
this.password = password;
this.getInfo = function()
alert(this.username + ", " + this.password);
var person = new Person("zhangsan","123");
person.getInfo();
4.使用原型(prototype)方式创建对象:
优点:创建的多个对象共享同一个方法(getInfo)
缺点:创建的多个对象在共享同一个方法的同时也共享了同样的属性(username,password),实际开发中这样儿是
不行的,必须是多个对象都要有自己的属性。
采用该方式创建对象通常是用来扩展已有对象的某一个方法。
a.
function Person()
Person.prototype.username = "zhangsan";
Person.prototype.password = "123";
Person.prototype.getInfo = function()
alert(this.username + ", " + this.password);
var person = new Person();
var person2 = new Person();
person.username = "lisi";
person.getInfo();
person2.getInfo();
b.如果使用原型方式创建对象,那么生成的所有对象将会共享原型中的属性,这样儿一个对象改变了该属性也会反应到其他的对象上:
function Person()
Person.prototype.username = new Array(0;
Person.prototype.password = "123";
Person.prototype.getInfo = function()
alert(this.username + ", " + this.password);
var person = new Person();
var person2 = new Person();
person.username.push("zhangsan");
person.username.push("lisi");
person.password = "456";
person.getInfo();
person2.getInfo();
c.使用原型和构造函数方式来创建对象:
function Person()
this.username = new Array();
this.password = "123"
Person.prototype.getInfo = function()
alert(this.username + ", " + this.password);
var person = new Person();
var person2 = new Person();
person.username.push("zhangsan");
person.username.push("lisi");
person.getInfo();
person2.getInfo();
5.动态原型方式:在构造函数中通过标志量让所有对象共享一个方法,而每个对象拥有自己的属性。
function Persion()
this.username = "zhangsan";
this.password = "123";
if(typeof Person.flag == "undefined")
Person.prototype.getInfo = function()
alert(this.username + ", " + this.password);
Person.flag = true;
var p = new Person();
var p2 = new Person();
p.getInfo();
p2.getInfo(); 参考技术A cat.prototype.showName=function()
console.log("the name is"+this.name);
不会报错,但是你这么写,每次new cat()时就会调用一次,经典写法只会在解析时运行一次,高下立判。本回答被提问者采纳 参考技术B Version: '1.5.1' 和 Version= '1.5.1' 是一样的
这个来源于js的简化语法
<script>
alert('go');
arr=[1, 2, 3]; //数组可以写成这样
for(i=0; i<arr.length; i++)
alert(arr[i]);
clazz=a: 1, b: 2, c: 3, d:function(o)alert('hi '+o+',^-^') //对象可以写成这样
clazz.d('Molly');
</script> 参考技术C cat.prototype.showName=function()
console.log("the name is"+this.name);
将showName添加到原型里面了来自:求助得到的回答 参考技术C animal.apply(this,arguments);
我可以像D3.js一样使用JasperReports吗?
我可以使用像D3.js这样的JasperReports。 D3 js是一个用于生成用户交互式报告的JavasSript lib,例如用户可以在报告like 中使用特定区域。
JasperReports真的支持这些功能吗?
目前Jasper Reports似乎不支持此功能,但您可以按照建议的here在自定义组件中实现D3支持。
以上是关于js中可以这样定义对象吗?的主要内容,如果未能解决你的问题,请参考以下文章
定义一个js函数,有三个参数,调用的时候,只传递前2个参数,这样可以吗?