can-define
Version:
Create observable objects with JS dot operator compatibility
136 lines (105 loc) • 3.19 kB
Markdown
can-define/map/map.extend extend
can-define/map/map.static
Define a custom map type.
`DefineMap.extend([name,] [static,] prototype)`
Extends DefineMap, or constructor functions derived from DefineMap,
to create a new constructor function.
```js
import {DefineMap} from "can";
const Person = DefineMap.extend(
// Optional debugger name
"Person",
// Optional static properties.
{
// Seal instances of this type. This is the default.
seal: true
},
{
first: "string",
last: { type: "string" },
fullName: {
get: function() {
return this.first + " " + this.last;
}
},
age: { default: 0 }
}
);
const me = new Person( { first: "Justin", last: "Meyer" } );
console.log( me.fullName ); //-> "Justin Meyer"
console.log( me.age ); //-> 0
```
{String} [name] Provides an optional name for this type that will
show up nicely in debuggers.
{Object} [static] Static properties that are set directly on the
constructor function.
{can-define.types.propDefinition} prototype A definition of the properties or methods on this type. See [can-define.types.propDefinition] for all available property definitions.
## Use
If the property definition is a __plain function__, it's considered a method.
```js
import {DefineMap} from "can";
const Person = DefineMap.extend( {
sayHi: function() {
console.log( "hi" );
}
} );
const me = new Person();
me.sayHi(); //-> "hi"
```
If the property definition is a __string__, it's considered a `type` setting to be looked up in [can-define.types can-define.types].
```js
import {DefineMap, DefineList} from "can";
const Person = DefineMap.extend( {
age: "number",
isCool: "boolean",
hobbies: "observable"
} );
const me = new Person( { age: "33", isCool: "false", hobbies: [ "js", "bball" ] } );
console.log( me.age ); //-> 33
console.log( me.isCool ); //-> false
console.log( me.hobbies instanceof DefineList ); //-> true
```
If the property definition is a Constructor function, it's considered a `Type` setting.
```js
import {DefineMap} from "can";
const Address = DefineMap.extend( {
zip: "number"
} );
const Person = DefineMap.extend( {
address: Address
} );
const me = new Person( { address: { zip: "60048" } } );
console.log( me.address.zip ); //-> 60048
```
If the property is an __object__, it's considered to be a [can-define.types.propDefinition].
```js
import {DefineMap} from "can";
const Person = DefineMap.extend( {
fullName: {
get: function() {
return this.first + " " + this.last;
},
set: function( newVal ) {
const parts = newVal.split( " " );
this.first = parts[ 0 ];
this.last = parts[ 1 ];
}
},
// slick way of creating an 'inline' type.
address: {
Type: {
zip: "number"
}
}
} );
const me = new Person( { fullName: "Rami Myer", address: { zip: "60048" } } );
console.log( me.first ); //-> "Rami"
console.log( me.address.zip ); //-> 60048
```
{can-define/map/map} A DefineMap constructor function.